-1

幫我解決這個問題。我仍然堅持這一個。我真的不明白如何。我是新學習Java,這是我第一次構建apk。 固定應用程序中的數據庫無法打開。我有三個水龍頭。主菜單,search1,search2。這兩個標籤搜索都不起作用(不幸的是,應用程序已停止)。但我可以在主菜單上解鎖按鈕。在菜單搜索中Java NullPointerexception而不是按鈕主菜單

而且當我在oncreate中調用initUi方法。它不起作用。主菜單中的我的按鈕和標籤搜索無法打開。

這裏是我的logcat當我運行我的應用程序比點擊搜索1

02-26 12:16:50.141: E/AndroidRuntime(1090): FATAL EXCEPTION: main 
02-26 12:16:50.141: E/AndroidRuntime(1090): Process: com.rdsj.land, PID: 1090 
02-26 12:16:50.141: E/AndroidRuntime(1090): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.rdsj.land/com.rdsj.land.keterangan}: java.lang.NullPointerException 
02-26 12:16:50.141: E/AndroidRuntime(1090):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2195) 
02-26 12:16:50.141: E/AndroidRuntime(1090):  at android.app.ActivityThread.startActivityNow(ActivityThread.java:2035) 
02-26 12:16:50.141: E/AndroidRuntime(1090):  at android.app.LocalActivityManager.moveToState(LocalActivityManager.java:135) 
02-26 12:16:50.141: E/AndroidRuntime(1090):  at android.app.LocalActivityManager.startActivity(LocalActivityManager.java:347) 
02-26 12:16:50.141: E/AndroidRuntime(1090):  at android.widget.TabHost$IntentContentStrategy.getContentView(TabHost.java:749) 
02-26 12:16:50.141: E/AndroidRuntime(1090):  at android.widget.TabHost.setCurrentTab(TabHost.java:413) 
02-26 12:16:50.141: E/AndroidRuntime(1090):  at android.widget.TabHost$2.onTabSelectionChanged(TabHost.java:154) 
02-26 12:16:50.141: E/AndroidRuntime(1090):  at android.widget.TabWidget$TabClickListener.onClick(TabWidget.java:546) 
02-26 12:16:50.141: E/AndroidRuntime(1090):  at android.view.View.performClick(View.java:4438) 
02-26 12:16:50.141: E/AndroidRuntime(1090):  at android.view.View$PerformClick.run(View.java:18422) 
02-26 12:16:50.141: E/AndroidRuntime(1090):  at android.os.Handler.handleCallback(Handler.java:733) 
02-26 12:16:50.141: E/AndroidRuntime(1090):  at android.os.Handler.dispatchMessage(Handler.java:95) 
02-26 12:16:50.141: E/AndroidRuntime(1090):  at android.os.Looper.loop(Looper.java:136) 
02-26 12:16:50.141: E/AndroidRuntime(1090):  at android.app.ActivityThread.main(ActivityThread.java:5017) 
02-26 12:16:50.141: E/AndroidRuntime(1090):  at java.lang.reflect.Method.invokeNative(Native Method) 
02-26 12:16:50.141: E/AndroidRuntime(1090):  at java.lang.reflect.Method.invoke(Method.java:515) 
02-26 12:16:50.141: E/AndroidRuntime(1090):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:779) 
02-26 12:16:50.141: E/AndroidRuntime(1090):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595) 
02-26 12:16:50.141: E/AndroidRuntime(1090):  at dalvik.system.NativeStart.main(Native Method) 
02-26 12:16:50.141: E/AndroidRuntime(1090): Caused by: java.lang.NullPointerException 
02-26 12:16:50.141: E/AndroidRuntime(1090):  at com.rdsj.aircraft.keterangan.checkResult(keterangan.java:101) 
02-26 12:16:50.141: E/AndroidRuntime(1090):  at com.rdsj.aircraft.keterangan.onCreate(keterangan.java:77) 
02-26 12:16:50.141: E/AndroidRuntime(1090):  at android.app.Activity.performCreate(Activity.java:5231) 
02-26 12:16:50.141: E/AndroidRuntime(1090):  at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1087) 
02-26 12:16:50.141: E/AndroidRuntime(1090):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2159) 
02-26 12:16:50.141: E/AndroidRuntime(1090):  ... 18 more 

這是我Keterangan.Java在這一行

package com.rdsj.land; 

import android.app.Activity; 
import android.app.AlertDialog; 
import android.net.Uri; 
import android.os.Bundle; 
import android.os.Handler; 
import android.preference.PreferenceManager; 
import android.speech.tts.TextToSpeech; 
import android.view.View; 
import android.webkit.WebView; 
import android.widget.Button; 
import java.util.Locale; 
import java.util.regex.Matcher; 
import java.util.regex.Pattern; 

import com.rdsj.land.R; 

import android.content.DialogInterface; 
import android.content.Intent; 
import android.content.SharedPreferences; 
import android.content.res.Configuration; 
import android.database.Cursor; 
import android.database.SQLException; 
import android.database.sqlite.SQLiteDatabase; 
import android.graphics.Color; 
import android.util.Patterns; 
import android.util.TypedValue; 
import android.view.Menu; 
import android.view.MenuInflater; 
import android.view.MenuItem; 
import android.view.Window; 
import android.view.WindowManager.LayoutParams; 
import android.widget.TextView; 
import android.widget.Toast; 

public class keterangan extends Activity implements TextToSpeech.OnInitListener { 

    final static int SEMUA = 1; 
    final static int CARI = 2; 
    final static int ROUNDLE = 3; 
    final String[] dict_name = new String[] {"SEMUA","CARI", "ROUNDLE"}; 

    private int DICT; 
    private String text; 
    private SQLiteDatabase db = null; 
    private Cursor catatan = null; 
    private DBPesawat db_pesawat_helper; 
    private TextToSpeech mTts; 
    private int SpeechStatus; 
    private float font_size; 

    TextView title, content; 
    Button speech, close; 
    WebView pic; 

    Handler handler = new Handler(); 
    Thread searching; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

     /* Get Intent Parameter */ 
     this.getIntentParameter(); 

     /* Open Database File */ 
     db_pesawat_helper = new DBPesawat(this); 
     try { 
     db_pesawat_helper.openDataBase(); 
     db = db_pesawat_helper.getReadableDatabase(); 
     }catch(SQLException sqle){ 
      throw sqle; 
     } 


     /* UI Initialization */      //null pointer in this line 
     if (checkResult()) this.initUI(); 
    } 

    private void getIntentParameter() { 
     // TODO Auto-generated method stub 
     Uri data = this.getIntent().getData(); 
     if (data!=null) { 
      DICT = Integer.parseInt(data.getQueryParameter("dict")); 
      text = data.getQueryParameter("text"); 
     } else { 
      DICT = this.getIntent().getExtras().getInt("DICT", 1); 
      text = this.getIntent().getExtras().getString("TEXT"); 
     } 
    } 

    private boolean checkResult() { 
     // TODO Auto-generated method stub 
     String catatan1; 
     switch(DICT) { 
      default: 
      case SEMUA: 
       catatan1 = "SELECT ringkasan FROM Main where lower(Type)=lower('"+text.replace("'", "''")+"') "; 
       break; 
      case CARI: 
       catatan1 = "SELECT * FROM Cari where lower(Nama_Pesawat)=lower('"+text.replace("'", "''")+"')"; // And this line null pointer too 
       break; 
      case ROUNDLE: 
       catatan1 = "SELECT * FROM Roundle where lower(Negara)=lower('"+text.replace("'", "''")+"')";  // This one too when I click on tab search Roundle 
       break; 
     } 
     catatan = db.rawQuery(catatan1, null); 
     if (!catatan.moveToFirst()) { 
      Toast.makeText(this, "word `"+text+"` not found in "+dict_name[DICT-1]+" dictionary !", Toast.LENGTH_SHORT).show(); 
      this.finish(); 
      return false; 
     } else return true; 
    } 

    private void initUI() { 
     // TODO Auto-generated method stub 
     this.requestWindowFeature(Window.FEATURE_NO_TITLE); 
     this.setContentView(R.layout.keterangan); 
     this.getWindow().setLayout(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT); 
     mTts = new TextToSpeech(this,this); 

     title = (TextView) findViewById(R.id.title); 
     content = (TextView) findViewById(R.id.content); 
     speech = (Button) findViewById(R.id.speech); 
     close = (Button) findViewById(R.id.close); 
     pic = (WebView) findViewById(R.id.tampil); 


     /* Define event callback function */ 
     speech.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View arg0) { 
       // TODO Auto-generated method stub 
       if (SpeechStatus == TextToSpeech.LANG_MISSING_DATA || SpeechStatus == TextToSpeech.LANG_NOT_SUPPORTED) 
        installLanguage(); 
       else 
        mTts.speak(text, TextToSpeech.QUEUE_FLUSH, null); 
      } 
     }); 

     close.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View arg0) { 
       // TODO Auto-generated method stub 
       keterangan.this.finish(); 
      } 
     }); 
    } 

    private boolean isValidUrl(String url) { 
     Pattern p = Patterns.WEB_URL; 
     Matcher m = p.matcher(url); 
     if(m.matches()) 
      return true; 
     else 
     return false; 
    } 



    @Override 
    public void onStart() { 
     super.onStart(); 

     /* Get Preferences */ 
     SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(getBaseContext()); 
     font_size = Float.parseFloat(prefs.getString("font_size", "18")); 

     /* Display Result */ 
     title.setText(text); 
     content.setTextSize(TypedValue.COMPLEX_UNIT_SP, font_size); 
     switch(DICT){ 
     case SEMUA : 
      pic.loadUrl("file:///android_asset/img/Q.jpg"); 
      content.setText(catatan.getString(0)); 
      content.setLinkTextColor(Color.rgb(0x44, 0x44, 0xBB)); 
      break; 
     default : 
      if(catatan.getString(3).equals("-")){ 
       pic.loadUrl("file:///android_asset/img/Q.jpg"); 
       pic.getSettings().setJavaScriptEnabled(true); 
      }else{ 
        pic.loadUrl(catatan.getString(3));    
       } 


      content.setText("Catatan\t:\t"+catatan.getString(2));    
      content.setLinkTextColor(Color.rgb(0x44, 0x44, 0xBB)); 
      break; 
     } 

    } 


    @Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
     MenuInflater inflater = getMenuInflater(); 
     inflater.inflate(R.drawable.readermenu, menu); 
     return true; 
    } 

    @Override 
    public boolean onOptionsItemSelected(MenuItem item) { 
     float current_size = content.getTextSize(); 
     switch (item.getItemId()) { 
     case R.id.zoomout: 
      content.setTextSize(TypedValue.COMPLEX_UNIT_PX, current_size*(float)(1/1.2)); 
      break; 
     case R.id.zoomin: 
      content.setTextSize(TypedValue.COMPLEX_UNIT_PX, current_size*(float)1.2); 
      break; 
     default: 
     return super.onOptionsItemSelected(item); 
     } 
     return true; 
    } 

    @Override 
    public void onDestroy() { 
     // Don't forget to shutdown! 
     if (mTts != null) { 
      mTts.stop(); 
      mTts.shutdown(); 
     } 
     super.onDestroy(); 
    } 

    /* Implements TextToSpeech.OnInitListener. */ 
    public void onInit(int status) { 
     if (status == TextToSpeech.SUCCESS) { 
      switch(DICT) { 
       default: 
       case SEMUA: 
       case CARI: 
        SpeechStatus = mTts.setLanguage(Locale.ITALY); 
        break; 
       case ROUNDLE: 
        SpeechStatus = mTts.setLanguage(Locale.ITALY); 
        break; 
      } 
      if (SpeechStatus == TextToSpeech.LANG_MISSING_DATA || SpeechStatus == TextToSpeech.LANG_NOT_SUPPORTED) { 
       // Lanuage data is missing or the language is not supported. 
       speech.setBackgroundResource(R.drawable.speech_disabled); 
      } else { 
       speech.setBackgroundResource(R.drawable.speech_button); 
      } 
     } else { 
      speech.setBackgroundResource(R.drawable.speech_disabled); 
      speech.setEnabled(false); 
      speech.setClickable(false); 
     } 
    } 

    /* Install speech language if not available */ 
    protected void installLanguage() { 
     // TODO Auto-generated method stub 
     new AlertDialog.Builder(this) 
     .setMessage("This language is not available.\nDo you want to install ?") 
     .setPositiveButton("Yes", new DialogInterface.OnClickListener() { 
      @Override 
      public void onClick(DialogInterface dialog, int which) { 
       // TODO Auto-generated method stub 
       Intent installIntent = new Intent(); 
       installIntent.setAction(TextToSpeech.Engine.ACTION_INSTALL_TTS_DATA); 
       startActivity(installIntent); 
      } 
     }) 
     .setNegativeButton("No", null) 
     .show(); 
    } 

    @Override 
    public void onConfigurationChanged(Configuration newConfig) { 
     super.onConfigurationChanged(newConfig); 
    } 
} 

空指針:如果(checkResult())this.initUI(); ()「;」break;「;」;「」;「」;「

這是我mainActivity:

package com.rdsj.land; 

import com.rdsj.land.R; 

import android.app.Activity; 
import android.app.AlertDialog; 
import android.app.TabActivity; 
import android.content.Intent; 
import android.content.res.Configuration; 
import android.content.res.Resources; 
import android.os.Bundle; 
import android.view.LayoutInflater; 
import android.view.Menu; 
import android.view.MenuInflater; 
import android.view.MenuItem; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.TabHost; 


public class MainActivity extends TabActivity { 
    /** Called when the activity is first created. */ 
    private AlertDialog.Builder builder; 
    private AlertDialog aboutDialog; 
    final String[] tab_menu = { 
      "Main Menu", 
      "Cari", 
      "Roundle"}; 


    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 

// call database helper 

     databasehelper bantuan = new databasehelper(MainActivity.this); 

     try { 
      bantuan.createDataBase(); 

    } catch (Exception e) { 
     // 1000: handle exception 

     // tell when error copy 

    System.out.println("Copy Database gagal " + e.getMessage()); 
    } 

    // tell when copy success 
    System.out.println("Copy Database Success"); 

     Resources res = getResources(); // Resource object to get Drawables 
     TabHost tabHost = getTabHost(); // The activity TabHost 
     TabHost.TabSpec spec; // Resusable TabSpec for each tab 
     Intent intent; // Reusable Intent for each tab 

     // All 
     intent = new Intent().setClass(this, rinci.class); 
     intent.putExtra("DICT", 1); 
     spec = tabHost.newTabSpec("all").setIndicator(tab_menu[0] , res.getDrawable(R.drawable.tab_style)).setContent(intent); 
     tabHost.addTab(spec); 

     // English to Indonesian 
     intent = new Intent().setClass(this, keterangan.class); 
     intent.putExtra("DICT", 2); 
     spec = tabHost.newTabSpec("en2id").setIndicator(tab_menu[1], res.getDrawable(R.drawable.tab_style)).setContent(intent); 
     tabHost.addTab(spec); 

     // Indonesian to English 
     intent = new Intent().setClass(this, keterangan.class); 
     intent.putExtra("DICT", 3); 
     spec = tabHost.newTabSpec("id2en").setIndicator(tab_menu[2], res.getDrawable(R.drawable.tab_style)).setContent(intent); 
     tabHost.addTab(spec); 

     // Select Default Tab 
     tabHost.setCurrentTab(0); 

     // Create About Dialog 
     LayoutInflater inflater = (LayoutInflater) this.getSystemService(LAYOUT_INFLATER_SERVICE); 
     View layout = inflater.inflate(R.layout.about, (ViewGroup) findViewById(R.id.layout_root)); 
     builder = new AlertDialog.Builder(this) 
     .setView(layout) 
     .setTitle("About") 
     .setNeutralButton("OK", null); 
     builder.setIcon(android.R.drawable.ic_dialog_info); 
     aboutDialog = builder.create(); 
     } 

     @Override 
     public void onConfigurationChanged(Configuration newConfig) { 
      super.onConfigurationChanged(newConfig); 
     } 

     @Override 
     public boolean onCreateOptionsMenu(Menu menu) { 
      MenuInflater inflater = getMenuInflater(); 
      inflater.inflate(R.drawable.mainmenu, menu); 
      return true; 
     } 

     @Override 
     public boolean onOptionsItemSelected(MenuItem item) { 
      switch (item.getItemId()) { 
      case R.id.setting: 
       Intent settingsActivity = new Intent(this.getBaseContext(), Setting.class); 
       startActivity(settingsActivity); 
       break; 
      case R.id.about: 
       aboutDialog.show(); 
       break; 
      case R.id.exit: 
       MainActivity.this.finish(); 
       break; 
      default: 
      return super.onOptionsItemSelected(item); 
      } 
      return true; 

    } 
} 

編輯: 我忘了,我有databasehelper

package com.rdsj.land; 


import java.io.FileOutputStream; 
import java.io.IOException; 
import java.io.InputStream; 
import java.io.OutputStream; 

import android.content.Context; 

import android.database.SQLException; 
import android.database.sqlite.SQLiteDatabase; 
import android.database.sqlite.SQLiteException; 
import android.database.sqlite.SQLiteOpenHelper; 

public class databasehelper extends SQLiteOpenHelper{ 

    // Direktori default 
    String DB_PATH =null; 

    // Variabel Nama Database 
    // Hanya mengganti di bagian ini saja 
    private static String DB_NAME = "PESAWAT.sqlite"; 

    // Variabel SQLiteDatabase 
    private SQLiteDatabase myDataBase; 

    // Variabel Context Untuk menggabungkan Dengan Sctivity 
    private final Context myContext; 

    /** 
    * Constructor 
    * Untuk Mengakses Asset Pada Project 
    * @param context 
    */ 
    public databasehelper(Context context) { 

     super(context, DB_NAME, null, 1); 
     this.myContext = context; 
     DB_PATH="/data/data/"+context.getPackageName()+"/"+"databases/"; 
    } 

    /** 
    * Membuat database kosong pada system dan menulis kembali sesuai dengan 
    * database kita yang berada pada Asset 
    * */ 
    public void createDataBase() throws IOException{ 

     boolean dbExist = checkDataBase(); 

     if(dbExist){ 
      //Tidak mengerjakan Jika database Sudah Ada 
     }else{ 

      // Memanggil Method dan Database Yang Telah Di Buat Di Direktori Default System 
      // Dari Method ini kita Dapat Menulis Database Kosong Dengan Database Kamu Dari Aplikasi 

      this.getReadableDatabase(); 

      try { 

       close(); 
       openDataBase(); 
       copyDataBase(); 


      } catch (IOException e) { 

       throw new Error("Error copying database"); 

      } 
     } 

    } 

    /** 
    * Cek jika database Tersedia untuk proses 
    * apakah Sudah Ada atau Belum 
    */ 
    private boolean checkDataBase(){ 

     SQLiteDatabase checkDB = null; 

     try{ 
      String myPath = DB_PATH + DB_NAME; 
      checkDB = SQLiteDatabase.openDatabase(myPath, null, SQLiteDatabase.OPEN_READONLY); 

     }catch(SQLiteException e){ 

      //Database Belum Tersedia 

     } 

     if(checkDB != null){ 

      checkDB.close(); 

     } 

     return checkDB != null ? true : false; 
    } 

    /** 
    * Copy Database Dari Asset Ke Database Kosong Yang Telah Dibuat. 
    * */ 
    private void copyDataBase() throws IOException{ 

     // Membuka Database Untuk proses Input Stream 
     InputStream myInput = myContext.getAssets().open(DB_NAME); 

     // Alamat untuk Membuat Database Kosong 
     String outFileName = DB_PATH + DB_NAME; 

     // Membuka Database Kosong Sebagai Output Stream untuk Copy 
     OutputStream myOutput = new FileOutputStream(outFileName); 

     //Proses transfer byte dari input stream ke output stream 
     byte[] buffer = new byte[1024]; 
     int length; 
     while ((length = myInput.read(buffer))>0){ 
      myOutput.write(buffer, 0, length); 
     } 

     //Tutup Stream 
     myOutput.flush(); 
     myOutput.close(); 
     myInput.close(); 

    } 

    public void openDataBase() throws SQLException{ 

     //Open Database 
     String myPath = DB_PATH + DB_NAME; 
     myDataBase = SQLiteDatabase.openDatabase(myPath, null, SQLiteDatabase.OPEN_READONLY); 

    } 

    @Override 
    public synchronized void close() { 

      if(myDataBase != null) 
       myDataBase.close(); 

      super.close(); 

    } 



    @Override 
    public void onCreate(SQLiteDatabase db) { 

    } 

    @Override 
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { 

    } 

} 

感謝您的幫助。

+0

你應該簡單地調用initUi方法的OnCreate –

+0

感謝快速響應英寸我會嘗試 – rdsj

回答

0

把你的setContentView放在onCreate裏面,這與onCreate方法有關,並且先被調用。

解決,如:

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.keterangan); //here 

    /* Get Intent Parameter */ 
    this.getIntentParameter(); 
    ...... 
      ....... 

從你的方法刪除:

private void initUI() { 
    // TODO Auto-generated method stub 
    this.requestWindowFeature(Window.FEATURE_NO_TITLE); 

    //removed from here 

    this.getWindow().setLayout(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT); 
    mTts = new TextToSpeech(this,this); 
+0

謝謝你的解釋先生。但它沒有奏效。現在我的主菜單上的按鈕無法打開。我可以撤消它.. – rdsj