2015-01-16 16 views
11

Timer ve TimerTask sınıflarını kullanarak basit bir zamanlayıcı yapmaya çalışıyorum. Aşağıdaki hatayı almaya devam:Sanal yöntemi çağırmayı deneme

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
xmlns:tools="http://schemas.android.com/tools"   android:layout_width="match_parent" 
android:layout_height="match_parent" android:paddingLeft="@dimen/activity_horizontal_margin" 
android:paddingRight="@dimen/activity_horizontal_margin" 
android:paddingTop="@dimen/activity_vertical_margin" 
android:paddingBottom="@dimen/activity_vertical_margin" tools:context=".MainActivity"> 

<TextView 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:textAppearance="?android:attr/textAppearanceLarge" 
    android:text="0:00" 
    android:id="@+id/timer" 
    android:layout_alignParentTop="true" 
    android:layout_centerHorizontal="true" 
    android:layout_marginTop="54dp" /> 

<Button 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:text="Start/Pause" 
    android:id="@+id/start" 
    android:layout_below="@+id/timer" 
    android:layout_alignParentLeft="true" 
    android:layout_alignParentStart="true" 
    android:layout_marginTop="119dp" 
    android:onClick="startB"/> 

<Button 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:text="Stop/Reset" 
    android:id="@+id/stop" 
    android:layout_alignBottom="@+id/start" 
    android:layout_alignParentRight="true" 
    android:layout_alignParentEnd="true" /> 
</RelativeLayout> 

Her çözüm bu hataya gördük: Burada

package com.austinheitmann.stopwatch; 

import android.os.CountDownTimer; 
import android.os.SystemClock; 
import android.support.v7.app.ActionBarActivity; 
import android.os.Bundle; 
import android.util.Log; 
import android.view.Menu; 
import android.view.MenuItem; 
import android.view.View; 
import android.widget.TextView; 

import java.util.Timer; 
import java.util.TimerTask; 


public class MainActivity extends ActionBarActivity { 

TextView timerf; 

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

int i=0; 




TimerTask time = new TimerTask() { 
    public void run() { 
     i++; 
     int k = i/60; 
     int j = i%60; 
     if (j>9) { 
      timerf.setText("seconds remaining: " + k + ":" + j); 
     }else { 
      timerf.setText("seconds remaining: " + k + ":0" + j); 
     } 
     Log.d("Uhh", "Sec:" + i); 
    } 
}; 

Timer timers = new Timer(); 

public void startB(View view) { 
timers.schedule(time, 100000000, 1000); 
} 

@Override 
public boolean onCreateOptionsMenu(Menu menu) { 
    // Inflate the menu; this adds items to the action bar if it is present. 
    getMenuInflater().inflate(R.menu.menu_main, menu); 
    return true; 

} 

@Override 
public boolean onOptionsItemSelected(MenuItem item) { 
    // Handle action bar item clicks here. The action bar will 
    // automatically handle clicks on the Home/Up button, so long 
    // as you specify a parent activity in AndroidManifest.xml. 
    int id = item.getItemId(); 

    //noinspection SimplifiableIfStatement 
    if (id == R.id.action_settings) { 
     return true; 
    } 

    return super.onOptionsItemSelected(item); 
} 
} 
} 

xml dosyası (düzeni): İşte

Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'android.view.View android.view.Window.findViewById(int)' on a null object reference 

benim kodudur düzeni ile ilgisi var ama ben zaten bunu değiştirmiyorum. StartB sınıfında TimerTask'a da taşındım ve aynı hatayı aldım. Bu hatayı nasıl düzeltebilirim?

Burada (hata meydana nerede koymak **) logcat temizledikten sonra Çalıştırmalar arasında olsun tüm hata var:

01-16 12:27:21.008 2455-2455/com.austinheitmann.stopwatch I/art﹕ Not late-enabling -Xcheck:jni (already on) 
01-16 12:27:21.119 2455-2455/com.austinheitmann.stopwatch D/AndroidRuntime﹕ Shutting down VM 
    --------- beginning of crash 
01-16 12:27:21.123 2455-2455/com.austinheitmann.stopwatch E/AndroidRuntime﹕ FATAL EXCEPTION: main 
    Process: com.austinheitmann.stopwatch, PID: 2455 
    java.lang.RuntimeException: Unable to instantiate activity ComponentInfo{com.austinheitmann.stopwatch/com.austinheitmann.stopwatch.MainActivity}: java.lang.NullPointerException: Attempt to invoke virtual method 'android.view.View android.view.Window.findViewById(int)' on a null object reference 
      at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2209) 
      at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2360) 
      at android.app.ActivityThread.access$800(ActivityThread.java:144) 
      at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1278) 
      at android.os.Handler.dispatchMessage(Handler.java:102) 
      at android.os.Looper.loop(Looper.java:135) 
      at android.app.ActivityThread.main(ActivityThread.java:5221) 
      at java.lang.reflect.Method.invoke(Native Method) 
      at java.lang.reflect.Method.invoke(Method.java:372) 
      at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:899) 
      at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:694) 
    Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'android.view.View android.view.Window.findViewById(int)' on a null object reference 
      at android.app.Activity.findViewById(Activity.java:2071) 
      at com.austinheitmann.stopwatch.MainActivity.<init>(MainActivity.java:25) 
      at java.lang.reflect.Constructor.newInstance(Native Method) 
      at java.lang.Class.newInstance(Class.java:1572) 
      at android.app.Instrumentation.newActivity(Instrumentation.java:1065) 
      at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2199) 
            at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2360) 
            at android.app.ActivityThread.access$800(ActivityThread.java:144) 
            at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1278) 
            at android.os.Handler.dispatchMessage(Handler.java:102) 
            at android.os.Looper.loop(Looper.java:135) 
            at android.app.ActivityThread.main(ActivityThread.java:5221) 
            at java.lang.reflect.Method.invoke(Native Method) 
            at java.lang.reflect.Method.invoke(Method.java:372) 
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:899) 
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:694) 
01-16 12:44:57.778 2582-2582/com.austinheitmann.stopwatch D/AndroidRuntime﹕ Shutting down VM 
01-16 12:44:57.778 2582-2582/com.austinheitmann.stopwatch E/AndroidRuntime﹕ FATAL EXCEPTION: main 
    Process: com.austinheitmann.stopwatch, PID: 2582 
    java.lang.RuntimeException: Unable to instantiate activity ComponentInfo{com.austinheitmann.stopwatch/com.austinheitmann.stopwatch.MainActivity}: java.lang.NullPointerException: Attempt to invoke virtual method 'android.view.View android.view.Window.findViewById(int)' on a null object reference 
      at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2209) 
      at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2360) 
      at android.app.ActivityThread.access$800(ActivityThread.java:144) 
      at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1278) 
      at android.os.Handler.dispatchMessage(Handler.java:102) 
      at android.os.Looper.loop(Looper.java:135) 
      at android.app.ActivityThread.main(ActivityThread.java:5221) 
      at java.lang.reflect.Method.invoke(Native Method) 
      at java.lang.reflect.Method.invoke(Method.java:372) 
      at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:899) 
      at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:694) 
    Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'android.view.View android.view.Window.findViewById(int)' on a null object reference 
      at android.app.Activity.findViewById(Activity.java:2071) 
      at com.austinheitmann.stopwatch.MainActivity.<init>(MainActivity.java:25) 
      at java.lang.reflect.Constructor.newInstance(Native Method) 
      at java.lang.Class.newInstance(Class.java:1572) 
      at android.app.Instrumentation.newActivity(Instrumentation.java:1065) 
      at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2199) 
            at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2360) 
            at android.app.ActivityThread.access$800(ActivityThread.java:144) 
            at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1278) 
            at android.os.Handler.dispatchMessage(Handler.java:102) 
            at android.os.Looper.loop(Looper.java:135) 
            at android.app.ActivityThread.main(ActivityThread.java:5221) 
            at java.lang.reflect.Method.invoke(Native Method) 
            at java.lang.reflect.Method.invoke(Method.java:372) 
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:899) 
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:694) 
01-16 12:46:25.059 2641-2641/com.austinheitmann.stopwatch D/AndroidRuntime﹕ Shutting down VM 
01-16 12:46:25.059 2641-2641/com.austinheitmann.stopwatch E/AndroidRuntime﹕ FATAL EXCEPTION: main 
    Process: com.austinheitmann.stopwatch, PID: 2641 
    java.lang.RuntimeException: Unable to instantiate activity ComponentInfo{com.austinheitmann.stopwatch/com.austinheitmann.stopwatch.MainActivity}: java.lang.NullPointerException: Attempt to invoke virtual method 'android.view.View android.view.Window.findViewById(int)' on a null object reference 
      at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2209) 
      at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2360) 
      at android.app.ActivityThread.access$800(ActivityThread.java:144) 
      at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1278) 
      at android.os.Handler.dispatchMessage(Handler.java:102) 
      at android.os.Looper.loop(Looper.java:135) 
      at android.app.ActivityThread.main(ActivityThread.java:5221) 
      at java.lang.reflect.Method.invoke(Native Method) 
      at java.lang.reflect.Method.invoke(Method.java:372) 
      at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:899) 
      at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:694) 
    Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'android.view.View android.view.Window.findViewById(int)' on a null object reference 
      at android.app.Activity.findViewById(Activity.java:2071) 
      at com.austinheitmann.stopwatch.MainActivity.<init>(MainActivity.java:25) 
      at java.lang.reflect.Constructor.newInstance(Native Method) 
      at java.lang.Class.newInstance(Class.java:1572) 
      at android.app.Instrumentation.newActivity(Instrumentation.java:1065) 
      at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2199) 
            at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2360) 
            at android.app.ActivityThread.access$800(ActivityThread.java:144) 
            at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1278) 
            at android.os.Handler.dispatchMessage(Handler.java:102) 
            at android.os.Looper.loop(Looper.java:135) 
            at android.app.ActivityThread.main(ActivityThread.java:5221) 
            at java.lang.reflect.Method.invoke(Native Method) 
            at java.lang.reflect.Method.invoke(Method.java:372) 
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:899) 
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:694) 
01-16 12:47:50.630 2702-2702/com.austinheitmann.stopwatch D/AndroidRuntime﹕ Shutting down VM 
01-16 12:47:50.630 2702-2702/com.austinheitmann.stopwatch E/AndroidRuntime﹕ FATAL EXCEPTION: main 
    Process: com.austinheitmann.stopwatch, PID: 2702 
    java.lang.RuntimeException: Unable to instantiate activity ComponentInfo{com.austinheitmann.stopwatch/com.austinheitmann.stopwatch.MainActivity}: java.lang.NullPointerException: Attempt to invoke virtual method 'android.view.View android.view.Window.findViewById(int)' on a null object reference 
      at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2209) 
      at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2360) 
      at android.app.ActivityThread.access$800(ActivityThread.java:144) 
      at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1278) 
      at android.os.Handler.dispatchMessage(Handler.java:102) 
      at android.os.Looper.loop(Looper.java:135) 
      at android.app.ActivityThread.main(ActivityThread.java:5221) 
      at java.lang.reflect.Method.invoke(Native Method) 
      at java.lang.reflect.Method.invoke(Method.java:372) 
      at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:899) 
      at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:694) 
    **Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'android.view.View android.view.Window.findViewById(int)' on a null object reference** 
      at android.app.Activity.findViewById(Activity.java:2071) 
      at com.austinheitmann.stopwatch.MainActivity.<init>(MainActivity.java:25) 
      at java.lang.reflect.Constructor.newInstance(Native Method) 
      at java.lang.Class.newInstance(Class.java:1572) 
      at android.app.Instrumentation.newActivity(Instrumentation.java:1065) 
      at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2199) 
            at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2360) 
            at android.app.ActivityThread.access$800(ActivityThread.java:144) 
            at  android.app.ActivityThread$H.handleMessage(ActivityThread.java:1278) 
            at android.os.Handler.dispatchMessage(Handler.java:102) 
            at android.os.Looper.loop(Looper.java:135) 
            at android.app.ActivityThread.main(ActivityThread.java:5221) 
            at java.lang.reflect.Method.invoke(Native Method) 
            at java.lang.reflect.Method.invoke(Method.java:372) 
            at  com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:899) 
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:694) 
+0

Eğer Simas' cevabını izledikten sonra, do 'temiz project' beyan 'build'-menüsü altında ve emülatörü yeniden başlatın. Bundan sonra durumumda istisna gitti. – progonkpa

cevap

29

Sen findViewById çalıştığınız etkinliğin bağlamda önce hazırdır.

sen başlatma, çok başka yöntemlerde timerf erişmek sınıf üyesi oluşturmak ama olmak için onCreatesetContentView sonra:

TextView timerf; 

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

Güncelleme:

ben fark etmedi diğer sınıf üyesi değişkenleri oluşturuyorsunuz. Null olan timerf 'a referans veriyorlar.

Bunları onCreate içinde de başlatmanız gerekir. İşte çalışmalıdır tam kod:

package com.austinheitmann.stopwatch; 

import android.os.CountDownTimer; 
import android.os.SystemClock; 
import android.support.v7.app.ActionBarActivity; 
import android.os.Bundle; 
import android.util.Log; 
import android.view.Menu; 
import android.view.MenuItem; 
import android.view.View; 
import android.widget.TextView; 

import java.util.Timer; 
import java.util.TimerTask; 


public class MainActivity extends ActionBarActivity { 

    Timer timers = new Timer(); 
    TextView timerf; 
    TimerTask time; 
    int i=0; 

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

     time = new TimerTask() { 
      public void run() { 
       i++; 
       int k = i/60; 
       int j = i%60; 
       if (j>9) { 
        timerf.setText("seconds remaining: " + k + ":" + j); 
       }else { 
        timerf.setText("seconds remaining: " + k + ":0" + j); 
       } 
       Log.d("Uhh", "Sec:" + i); 
      } 
     }; 
    } 

    public void startB(View view) { 
     timers.schedule(time, 100000000, 1000); 
    } 

    @Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
     // Inflate the menu; this adds items to the action bar if it is present. 
     getMenuInflater().inflate(R.menu.menu_main, menu); 
     return true; 

    } 

    @Override 
    public boolean onOptionsItemSelected(MenuItem item) { 
     // Handle action bar item clicks here. The action bar will 
     // automatically handle clicks on the Home/Up button, so long 
     // as you specify a parent activity in AndroidManifest.xml. 
     int id = item.getItemId(); 

     //noinspection SimplifiableIfStatement 
     if (id == R.id.action_settings) { 
      return true; 
     } 

     return super.onOptionsItemSelected(item); 
    } 
} 
+0

Söylediğim değişiklikleri yaptım ama yine de aynı hatayı alıyorum, sorudaki kod yanıtınız ile güncellendi. – aheit

+0

@aheit düzeninizi gönderin (activity_main.xml) – Simas

+0

activity_main.xml dosyasını ekledim – aheit

-3

İlk sen yapıcı kullananların public MainActivity() ve Timer timer; ve long startTime; long stopTime Şapır değişken

public MainActivity() { 
    timer = new Timer(); 
    startTime = System.currentTimeMillis(); 
    stopTime = 0; 
} 
+1

Bu örnek değişkenlerin her biri, başlatılacak bir kurucuya ihtiyaç duymaz ve gerçekten de android aktiviteleri için bir kurucu bildirmeniz gerekir. –

+1

'Gobble değişkeni nedir? Eğer 'global' için bir yazım hatası varsa, Java'da globals yok; OP muhtemelen üye demektir? –