2012-01-02 76 views
1

我已經寫了一個Java應用程序,現在我試圖移植到Android,但由於某些原因,使用BufferedReader的readLine()方法返回null 。我已經測試了Java中的代碼,它工作正常沒有問題。我正在閱讀的文件是一個純文本文件,我已將其放入其餘的java文件中。我的代碼簡單需要在登錄,並經與在配置文件中的文本文件閱讀點擊登錄按鈕檢查細節用戶輸入下面是我的代碼簡單化:BufferedReader在Android應用程序中返回null,但在Java應用程序中不返回

OnClickListener在主要活動:

button.setOnClickListener(new View.OnClickListener() { 
     public void onClick(View v) { 
      EditText textUsername = (EditText) findViewById(R.id.textUsername); 
      EditText textPassword = (EditText) findViewById(R.id.textPassword); 

      // Collect the login details entered by the user 
      String username = textUsername.getText().toString(); 
      String password = textPassword.getText().toString(); 

      // Check if login details are correct 
      LoginModel login = new LoginModel(); 
      Correct = login.isCorrect(username, password); // LINE COMMENTED 
      // OUT SO THAT DETAILS DON'T NEED TO BE ENTERED 

      //    Correct = true; // used to bypass login for now 
      if (Correct) { // if details are correct then start main program 
       Intent intent = new Intent (LoginView.this, MenuListView.class); 
       startActivity(intent); 
      } 
      else System.out.println("Login is incorrect..."); 

     } 
    }); 
} 

的LoginModel.java類:

public LoginModel() { 
    file = new File("Profiles"); 
    try { 
     br = new BufferedReader(new FileReader(file)); 
    } catch (FileNotFoundException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 
    System.out.println("Login Constructor successful!"); 
} 

// Checks whether the inputted details are correct 
public static boolean isCorrect(String u, String p) { 
    System.out.println(p); 
    boolean check = false; 
    String line = null; 
    try { 
     do { 
      line = br.readLine(); // This line is returning null 
      // System.out.println("Checking profile : " + line); 
      String[] info = line.split("\t"); 
      // nested if-statement to improve efficiency over && 
      if (info[0].equals(u)) { 
       System.out.println("username found!"); 
       if (info[1].equals(p)) { 
        System.out.println("password correct!"); 
        check = true; 
       } else 
        System.out.println("password incorrect!"); 
      } else 
       System.out.println("username not found!"); 
     } while (line != null && check == false); 
    return check; 

它是br.readLine(),這是由於某種原因返回null。我查了它,bufferedreader似乎完全支持。

編輯:好的,我發現它並不是真的找到這個文件,而是可能試圖執行isCorrect()方法,因爲它是靜態的。我已經刪除了方法和br聲明靜態標籤,並將配置文件文件移動到了所有我的java文件的文件夾中,但仍然無法找到它。我應該如何參考這個職位?如果我只是簡單地引用它的名字,那麼android查找文件的默認位置是什麼?非常感謝!

回答

0

我不知道這是否是NPE的實際原因卻是definetly了一個錯誤:

要初始化在構造函數br,但你在isCorrect()是靜態的使用它!它不需要調用orener中的封閉類LoginModel,因此在使用br之前可能根本不會調用c'tor。

您應該在聲明時初始化爲br,或者在靜態作用域中,以便在類加載時進行初始化。

編輯:注意,它也預示着br聲明爲static - 這樣的LogicModel所有實例實際使用的br相同的對象!
br.readLine()返回爲空的原因 - 可能是您已在其他調用isCorrect()或其他使用br的方法中使用該文件,但無法在沒有更多代碼的情況下知道該文件。

+0

這是一個很好的觀點 - 我剛開始使用Java,並且因爲它似乎幫助我避免了很多範圍問題,而陷入了將很多方法聲明爲靜態的壞習慣,但顯然有很多我現在知道的陷阱!我已經刪除了靜態修飾符,並沒有刪除錯誤。如果我正在閱讀文本文件,我應該將它放在我的Android項目中? – user1058210 2012-01-02 22:44:19

+0

取決於,如果您出於某種原因需要實際的文件名,請使用資產,它位於單獨的文件夾中:[project]/assets。否則,您可以使用原始資源,其中有[project]/res/raw文件夾。您可以使用Resources.openRawResource(http://developer.android.com/reference/android/content/res/Resources.html#openRawResource(int))或(使用資產時)使用資產管理器(http: //developer.android.com/reference/android/content/res/AssetManager.html)。 – Boude 2012-01-02 23:02:16

+0

@ user1058210:閱讀我的編輯,瞭解br爲什麼可能返回null。 – amit 2012-01-03 08:23:33

0

你確定FileNotFoundException沒有被捕獲?這意味着Android無法找到該文件,因此無法創建BufferedReader,因此將其保留爲空。在進程中使用斷點在logcat中搜索FileNotFoundException(通常爲橙色)或使用斷點進行調試。

編輯: 在android中使用文件時,通常將它們放在res/raw文件夾中。這是因爲android沒有文件的主要起點。事實上,android更喜歡限制對文件的訪問(因爲邏輯安全問題)。

所以你必須做的:

  1. 放置在res /原始文件夾中的文件並重新命名爲「配置文件」 (安卓不允許在資源轉換爲大寫)(也許你必須先到 創建文件夾)。

  2. 編輯你的構造函數接收 資源(將其更改爲: 「公共LoginModel(資源RES)」)

  3. 編輯相應的初始化(改變 「LoginModel登錄=新 LoginModel();」 來「LoginModel login = new LoginModel(getResources());」)

  4. 然後改變「br = new BufferedReader(new FileReader(file));」 to「br = new BufferedReader(new InputStreamReader(res.openRawResources(R.raw.profiles)));」

  5. 刪除行「file = new File(」Profiles「);」

+0

嘿你是正確的 - 它實際上並沒有找到該文件。我將它放在與我的所有Java文件相同的位置,並在代碼中簡單引用它的名稱,但仍無法找到它。我將如何參考它的位置? – user1058210 2012-01-03 11:28:53

相關問題