【问题标题】:NullPointerException: lock == nullNullPointerException: 锁定 == null
【发布时间】:2013-03-14 18:48:31
【问题描述】:

我在活动中遇到问题:我想从Ordinazioni.txt 中读取在上一个活动中正确写入的所有文件,将它们放入ArrayList 并将其中的每个元素写入 MySQL 数据库。

现在,PHP 文件和文件是正确的,我已经单独检查了它和它们的工作原理,但是此时 LogCat 阻止了应用程序。所以,这里是活动和 LogCat。

public class AggiungiProdotto extends Activity {

    TextView tv1;
    private static String indirizzo ="http://10.0.2.2/tesina/Aggiungi_Ordinazione";
    FileInputStream in = null;
    InputStreamReader inputStreamReader = new InputStreamReader(in);
    BufferedReader bufferedReader = new BufferedReader(inputStreamReader);
    HttpClient httpclient = new DefaultHttpClient();
    HttpPost httppost = new HttpPost(indirizzo);
    StringBuilder sb = new StringBuilder();
    int Tavolo = 1;
    String line;
    public ArrayList<String> Lettura = new ArrayList<String>();

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

    public void Invio() {
        try {
            FileInputStream in = openFileInput("Ordinazioni.txt");
            while ((line = bufferedReader.readLine()) != null) {
                Lettura.add(line);
            }
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

        Thread thread = new Thread() {

            @Override
            public void run() {
                try {
                    for (int i = 0; i < Lettura.size(); i++) {
                        List<NameValuePair> Comanda = new ArrayList<NameValuePair>(2);
                        Comanda.add(new BasicNameValuePair("Nome", Lettura.get(i)));
                        Comanda.add(new BasicNameValuePair("Tavolo",
                                Integer.toString(Tavolo).trim()));

                        httppost.setEntity(new UrlEncodedFormEntity(Comanda));

                        ResponseHandler<String> responseHandler =
                                new BasicResponseHandler();
                        final String Risposta = httpclient.execute(httppost,
                                responseHandler);
                        tv1 = (TextView) findViewById(R.id.tv1);
                        tv1.setText("Response : " + Risposta);
                    }
                } catch (ClientProtocolException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                } catch (IOException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
        };

        thread.start();
    }
}

LogCat 错误:

03-14 18:40:42.028: E/AndroidRuntime(772): FATAL EXCEPTION: main
03-14 18:40:42.028: E/AndroidRuntime(772): java.lang.RuntimeException: Unable to instantiate activity ComponentInfo{com.gabriele.tesina/com.gabriele.tesina.AggiungiProdotto}: java.lang.NullPointerException: lock == null
03-14 18:40:42.028: E/AndroidRuntime(772):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2106)
03-14 18:40:42.028: E/AndroidRuntime(772):  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2230)
03-14 18:40:42.028: E/AndroidRuntime(772):  at android.app.ActivityThread.access$600(ActivityThread.java:141)
03-14 18:40:42.028: E/AndroidRuntime(772):  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1234)
03-14 18:40:42.028: E/AndroidRuntime(772):  at android.os.Handler.dispatchMessage(Handler.java:99)
03-14 18:40:42.028: E/AndroidRuntime(772):  at android.os.Looper.loop(Looper.java:137)
03-14 18:40:42.028: E/AndroidRuntime(772):  at android.app.ActivityThread.main(ActivityThread.java:5039)
03-14 18:40:42.028: E/AndroidRuntime(772):  at java.lang.reflect.Method.invokeNative(Native Method)
03-14 18:40:42.028: E/AndroidRuntime(772):  at java.lang.reflect.Method.invoke(Method.java:511)
03-14 18:40:42.028: E/AndroidRuntime(772):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793)
03-14 18:40:42.028: E/AndroidRuntime(772):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560)
03-14 18:40:42.028: E/AndroidRuntime(772):  at dalvik.system.NativeStart.main(Native Method)
03-14 18:40:42.028: E/AndroidRuntime(772): Caused by: java.lang.NullPointerException: lock == null
03-14 18:40:42.028: E/AndroidRuntime(772):  at java.io.Reader.<init>(Reader.java:64)
03-14 18:40:42.028: E/AndroidRuntime(772):  at java.io.InputStreamReader.<init>(InputStreamReader.java:122)
03-14 18:40:42.028: E/AndroidRuntime(772):  at java.io.InputStreamReader.<init>(InputStreamReader.java:59)
03-14 18:40:42.028: E/AndroidRuntime(772):  at com.gabriele.tesina.AggiungiProdotto.<init>(AggiungiProdotto.java:32)
03-14 18:40:42.028: E/AndroidRuntime(772):  at java.lang.Class.newInstanceImpl(Native Method)
03-14 18:40:42.028: E/AndroidRuntime(772):  at java.lang.Class.newInstance(Class.java:1319)
03-14 18:40:42.028: E/AndroidRuntime(772):  at android.app.Instrumentation.newActivity(Instrumentation.java:1054)
03-14 18:40:42.028: E/AndroidRuntime(772):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2097)

我做错了什么?

【问题讨论】:

  • 因为你在这里传递 null inputStreamReader = new InputStreamReader(in);

标签: android multithreading file


【解决方案1】:
FileInputStream in = null;
InputStreamReader inputStreamReader = new InputStreamReader(in);

我认为这是一个问题:您将 NULLFileInputStream 添加到 InputStreamReader 中。

您的代码也比较混乱。看这里

tv1 = (TextView) findViewById(R.id.tv1);
tv1.setText("Response : " + Risposta);

您正在尝试从 worker Thread 更新 UI,所以如果您要解决第一个问题,下一个问题就是这个。

您无法通过工作线程的 UI 进行操作。这不被允许。只有 originate(UI) 线程 可以使用 UI 进行操作。

所以如果你想让它工作,你需要使用已经在 UI 线程而不是普通线程上运行的runOnUiThread()

注意:为了改进您的代码,我建议您使用AsyncTask 来执行 Internet 操作,并在某些操作期间/之后执行 UI 更新。 AsyncTask 被指定用于像你这样的事情。这是nice tutorial by Lars Vogel,如果您以前从未实现过它。

【讨论】:

  • 我现在已经实现了 AsyncTask,并根据您的提示解决了我的问题。非常感谢:)
【解决方案2】:

除了指出的其他问题外,请注意您正在尝试从新线程更新您的TextView。 Android的UI系统不是线程安全的,所以下面这行是另一个问题:

tv1.setText("Response : " + Risposta);'

您可以使用this example from the docs 解决此问题,而无需对代码进行太多重组。它使用 Handler 类返回 UI 线程。

【讨论】:

  • +1vote 这也是当前代码的一个问题,但在这种情况下,OP 将得到 CalledFromWrongThreadException: Only the original thread.. 而不是 NullPointerException
【解决方案3】:

我收到了类似的错误。我遇到的问题是我在我的 Mac 上运行了两个 Android Studio 实例,当我在设备上运行应用程序时它们相互冲突。

关闭一个 Android Studio 实例后,我能够毫无问题地运行该应用程序。

【讨论】:

    猜你喜欢
    • 2013-08-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多