Java 错误:尝试调用虚拟方法。。。关于空对象引用

Java 错误:尝试调用虚拟方法。。。关于空对象引用,java,android,xml,Java,Android,Xml,虽然这个问题已经被问了好几次,但没有一个解决方案对我有效。我总是突然出现这个错误,我想我可能有一个与其他人不同的问题 下面是负责的班级: @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_car); } NumberF

虽然这个问题已经被问了好几次,但没有一个解决方案对我有效。我总是突然出现这个错误,我想我可能有一个与其他人不同的问题

下面是负责的班级:


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_car);
    }

    NumberFormat currencyFormatter = NumberFormat.getCurrencyInstance();
    PageDownloader PDL = new PageDownloader();


    TextView tv1 = findViewById(R.id.textView6);
    TextView tv2 = findViewById(R.id.textView5);
    TextView tv3 = findViewById(R.id.textView3);

    public int Distance;
    public int Mileage;
    float GasPriceMid;
    float GasPricePre;
    float GasPriceReg;
    public float Toll;
    public float Parking;
    String StringPriceReg;
    String StringPriceMid;
    String StringPricePre;


除了这个:

public class MenuActivity extends AppCompatActivity {

    PriceCalculator PC = new PriceCalculator();
    //PageDownloader PDL = new PageDownloader();


    EditText et1 = findViewById(R.id.et1);
    EditText et2 = findViewById(R.id.et2);
    EditText et3 = findViewById(R.id.et3);
    EditText et4 = findViewById(R.id.et4);
本应简单地创建对这些对象的引用,但收到以下错误:

    Process: com.example.ojd.pricecalculatorapp, PID: 5067
    java.lang.RuntimeException: Unable to instantiate activity ComponentInfo{com.example.ojd.pricecalculatorapp/com.example.ojd.pricecalculatorapp.MenuActivity}: java.lang.NullPointerException: Attempt to invoke virtual method 'android.view.Window$Callback android.view.Window.getCallback()' on a null object reference
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3135)
        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3418)
        at android.app.ActivityThread.access$1100(ActivityThread.java:231)
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1823)
        at android.os.Handler.dispatchMessage(Handler.java:102)
        at android.os.Looper.loop(Looper.java:148)
        at android.app.ActivityThread.main(ActivityThread.java:7422)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1230)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1120)
     Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'android.view.Window$Callback android.view.Window.getCallback()' on a null object reference
        at android.support.v7.app.AppCompatDelegateImpl.<init>(AppCompatDelegateImpl.java:249)
        at android.support.v7.app.AppCompatDelegate.create(AppCompatDelegate.java:182)
        at android.support.v7.app.AppCompatActivity.getDelegate(AppCompatActivity.java:520)
        at android.support.v7.app.AppCompatActivity.findViewById(AppCompatActivity.java:191)
        at com.example.ojd.pricecalculatorapp.PriceCalculator.<init>(PriceCalculator.java:19)
        at com.example.ojd.pricecalculatorapp.MenuActivity.<init>(MenuActivity.java:9)
        at java.lang.Class.newInstance(Native Method)
        at android.app.Instrumentation.newActivity(Instrumentation.java:1096)
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3125)
        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3418) 
        at android.app.ActivityThread.access$1100(ActivityThread.java:231) 
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1823) 
        at android.os.Handler.dispatchMessage(Handler.java:102) 
        at android.os.Looper.loop(Looper.java:148) 
        at android.app.ActivityThread.main(ActivityThread.java:7422) 
        at java.lang.reflect.Method.invoke(Native Method) 
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1230) 
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1120) 
和(MenuActivity.java:9)


提前谢谢,我希望答案不会只是我犯的愚蠢错误。

我认为
TextView tv1=findViewById(R.id.TextView 6)应该在onCreate方法中


试着把它们放在onCreate方法中

很难从代码片段中分辨出来,但PriceCalculator似乎是从AppCompative扩展而来的。您不应在活动中使用新运算符。这样做会导致活动没有适当的上下文集,您将无法使用findViewById()之类的方法。我不知道为什么MenuActivity中有另一个活动的实例。这也是一个坏主意,活动不应该相互引用,而应该通过意图进行交流。解决这两个问题应该会使事情变得更好。

只需将所有标识放在Activity onCreate函数中即可。意思是说

 @Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_car);
    TextView tv1 = findViewById(R.id.textView6);
    TextView tv2 = findViewById(R.id.textView5);
    TextView tv3 = findViewById(R.id.textView3);
}

由于PriceCalculator是使用新的运算符创建的,因此可能不会调用onCreate()。通常,onCreate()会是这些行的正确位置,但我认为它不会帮助解决代码中的其他问题。如果您的价格计算器是使用“new”创建的,假设它是一个模型类,我认为它不应该有这些UI(TextView),也不应该扩展AppCompatActivity?如果您想查找DViewById,应该调用setContentView()!顺便说一句,如果你想更改activity
Intent i=new Intent(this,ActivityTwo.class)startActivity(i)
请参考以下内容:是的,我知道intents,但setContentView()目前起作用,但我计划稍后更改。我要试试这些建议。感谢guysPriceCalculator不应该是一个活动,它只是一个java类,所以我应该删除
扩展AppCompativty
?MenuActivity中的实例用于调用方法,那么我应该怎么做呢?正确,PriceCalculator不应该扩展AppCompatActivity,也不应该包含对视图的引用。将TextView引用移动到MenuActivity中。
PriceCalculator PC = new PriceCalculator();
 @Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_car);
    TextView tv1 = findViewById(R.id.textView6);
    TextView tv2 = findViewById(R.id.textView5);
    TextView tv3 = findViewById(R.id.textView3);
}