2017-09-24 103 views
-2

我是Android开发新手。我的应用程序编译完美(没有错误,没有警告),但它在启动时崩溃。我已经诊断出崩溃的原因是NullPointerException,并且我发现如果根据此声明删除TextView output = (TextView) findViewById(R.id.outputbox);以及所有行,该应用程序将启动罚款。我做了研究(无论是在Stack Exchange上还是在Stack Exchange上,还有大约5页的Google结果),而且我找到的解决方案都没有工作,这就是我问这个问题的原因。在TextView output = (TextView) findViewById(R.id.outputbox);之前我已经运行setContentView(R.layout.activity_main);,并且在activity_main.xml中声明了outputbox。这不是现有问题的重复,因为其他答案的答案并未解决我的问题。findViewById导致NullPointerException无明显原因

+0

发布您的.xml和活动代码。 –

+0

发布.xml代码 –

+0

您几乎不会为任何特定场景找到现成的解决方案。关键是*理解*问题和*适应*解决方案。 – shmosel

回答

0

很可能您的声明和变量output的初始化属于该类。这是行不通的。方法findViewById只有在调用setContentView方法后才能使用。这就是为什么你必须声明你的类变量,但setContentView方法后,立即在该方法onCreate初始化:

public class MainActivity extends AppCompatActivity { 

    TextView output; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     output = (TextView) findViewById(R.id.outputbox) 
    } 

} 

的方法findViewById搜索在XML您的组件。为了这个工作,你必须指出这个Activity将使用什么XML文件。这在setContentView(R.layout.activity_main);命令中完成。这是一个常见的错误,所以不用担心:)

+0

我的声明和初始化都在同一行中的类中,但在方法之后。为什么不这样做? – person

+0

在任何方法被调用之前,类中变量的声明和初始化都会发生。所以初始化将是你的类中第一个运行的代码。阅读活动生命周期 - 当活动在屏幕上可视化时,调用onCreate方法,然后findViewById方法可以工作。切勿在类中使用findViewById,只能在名为AFTER onCreate的方法中使用:) –

+0

我将尽快阅读关于Activity的生命周期。感谢您的帮助。 – person

相关问题