【问题标题】:Output an object to the Logcat console将对象输出到 Logcat 控制台
【发布时间】:2016-08-17 07:22:01
【问题描述】:

我想查看一个对象,类似于 php 中的 print_r(an_object) 或 javascript(浏览器中)中的 console.log(an_object),但适用于 Android。

我试过了

public void a_method( SomeClass the_arg )
{ 
    Log.d( "an_id" , the_arg );
}

这会生成一条错误消息:

错误:(23, 10) 错误: 没有找到适合 d(String,View) 的方法 方法 Log.d(String,String,Throwable) 不适用 (实际参数列表和形式参数列表的长度不同) 方法 Log.d(String,String) 不适用 (实参View无法通过方法调用转换为String)

【问题讨论】:

    标签: android logging


    【解决方案1】:

    您不能像在 javascript 中那样在 Java 中将对象打印到控制台。

    您有三个解决方案。

    1) 使用调试器。在android studio中放置断点并调试。然后您可以检查范围内的完整对象。

    2) 序列化您的对象(例如 JSON)并将结果打印到控制台。

    3) 覆盖对象的toString 方法,为您提供所需的所有信息并调用Log.d("myTag", yourObj.toString())

    我强烈推荐第一种方法。我曾经避免使用调试器,但学习如何使用调试器是我做过的最好的事情。它可以提高您的效率并使调试变得超级简单

    【讨论】:

    • 我将此标记为答案,因为它告诉我我的 javascript 思维必须改变 (You cannot print an object to the console in Java as you would in javascript.),它提供了几个选项
    • 对于选项 3,请注意 NullPointerException
    • 如果您希望yourObj 在任何时候都为空,那么@cricket_007 非常好。如果yourObj 不应该为空,我倾向于不进行空检查并让应用程序崩溃。然后我可以跟踪 obj 为 null 的原因。
    • 这就是我在不确定的值上使用String.valueOf 的原因。这将 null 作为字符串返回,而不是崩溃
    • 2 是最好的,谢谢。用JSON.stringify(someObject) 做的。
    【解决方案2】:

    第二个参数必须是字符串。

    Log.d("an_id", String.valueOf(the_arg));
    

    您的错误表明您无法记录View

    没有找到适合 d(String,View) 的方法

    当您通过使用String.valueOf 打印View 对象时,当您在控制台中看到一些废话时不要感到惊讶

    【讨论】:

      【解决方案3】:

      将对象转换为 JSON。您可以使用 Gson。

      val gson = Gson()
      val json = gson.toJson(yourObject)
      Log.e(TAG, json)
      

      或者

      Log.e(TAG, Gson().toJson(yourObject))
      

      【讨论】:

      • 感谢您的解决方案。
      【解决方案4】:

      在logcat中输出数据对象有点容易。

      正确的做法是override对象里面的toString()。 它可以通过以下简单步骤由 Android Studio 自己生成:

      1- 打开数据类

      2- 按 Alt+Insert 或右键单击并单击 Generate...

      3- 在生成窗口中选择toString()

      4- 在下一个窗口中选择所有变量并点击OK

      5- toString() 方法将 override 在您的数据类中返回您的数据模型的 String 模板。

      干杯!

      【讨论】:

        【解决方案5】:

        刚刚写了一个通用方法,这使得它可以通过反射:

        @Override
        public String toString() {
            StringBuilder sb = new StringBuilder();
            for (Field field : this.getClass().getDeclaredFields()) {
                String item;
                if(! field.getType().getSimpleName().equals("ArrayList")) {
                    try {
                        Object value = field.get(this);
                        item = String.format("%s %s %s: %s%n", Modifier.toString(field.getModifiers()), field.getType().getSimpleName(), field.getName(), String.valueOf(value));
                        sb.append(item);
                    } catch (IllegalAccessException e) {
                        e.printStackTrace();
                    }
                } else {
                    item = String.format("%s %s %s: ArrayList<>%n", Modifier.toString(field.getModifiers()), field.getType().getSimpleName(), field.getName());
                    sb.append(item);
                }
            }
            return sb.toString();
        }
        

        【讨论】:

          猜你喜欢
          • 2021-04-09
          • 2019-10-06
          • 1970-01-01
          • 2021-10-08
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-02-22
          相关资源
          最近更新 更多