0

最近我正在开发一个应用程序来显示阵列适配器中的一些文件信息。

所以我的代码如下所示:

AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this)
        .setIcon(R.drawable.ic_launcher).setTitle("Details");
ArrayAdapter<String> arrayAdapter = new ArrayAdapter<String>(
         DriveActivity.this, android.R.layout.select_dialog_item);
// Case 1
String DIR_NAME = "Directory Name : " + 
         (itemSelectedFile.getTitle() != null ? itemSelectedFile.getTitle() : "");

arrayAdapter.add(DIR_NAME);
// Case 3
arrayAdapter.add(("Directory Md5 Checksum : " + 
                  (itemSelectedFile.getMd5Checksum() != null ?
                       itemSelectedFile.getMd5Checksum(): "").toString()));

// Case 2
arrayAdapter.add("Directory Mime Type : " + 
                 itemSelectedFile.getMimeType() != null ?
                     itemSelectedFile.getMimeType() : "");

如您所见,我通过三种方式将项目添加到 ArrayAdapter 中:

  1. 通过从段字符串中制作一个字符串。
  2. 通过在 ArrayAdapter 的参数化 add() 方法中直接添加两个字符串,而不在两个段上使用 toString() 方法。
  3. 通过在两个段上使用 toString() 方法直接在 ArrayAdapter 的参数化 add() 方法中添加两个字符串。

我在案例 1、3 和 2 中得到不同的结果

在 1 和 3 的情况下,我得到的预期结果为

  1. 目录名称:猫
  2. 目录 Md5 校验和:'check_sum'

但在案例 2 中,我得到了这个:“mime/type”(没有附加的“Directory Mime Type:”!!!),在某些情况下,当 mimetype 为空时,我得到一个 NULL POINTER EXCEPTION。
任何人都请解释一下这里发生了什么。

4

2 回答 2

2

这是此表达式中的运算符优先级问题

        "Directory Mime Type : " + 
             itemSelectedFile.getMimeType() != null ?
                 itemSelectedFile.getMimeType() : ""

三元运算符 ( ?) 的优先级低于+and !=

所以这意味着表达式实际上与此相同:

        (("Directory Mime Type : " + 
             itemSelectedFile.getMimeType()) != null) ?
                 itemSelectedFile.getMimeType() : ""
于 2013-08-27T14:03:32.917 回答
0

你有一个小错误。你忘记 ”()”:

arrayAdapter.add("Directory Mime Type : " + 
             (itemSelectedFile.getMimeType() != null ?
                 itemSelectedFile.getMimeType() : ""));

您在案例 2 中有这些,但在案例 3 中没有。这就是您的代码等于这些的原因:

arrayAdapter.add(("Directory Mime Type : " + 
             itemSelectedFile.getMimeType() != null) ?
                 itemSelectedFile.getMimeType() : "");

你有空指针异常,因为你的 itemSelectedFile = null,我猜。在调用 getMimeType() 之前,您必须检查它。

于 2013-08-27T14:04:07.663 回答