【问题标题】:Why shouldn't I use System.out.println() in android为什么我不应该在 android 中使用 System.out.println()
【发布时间】:2013-08-23 02:50:17
【问题描述】:

Android Open Source Project's code style 中,它声明我们不应该使用System.out.println(),但我不明白为什么。谁能解释一下?我应该使用什么来跟踪我的应用程序的日志?

这是供参考的行:

System.out.println()(或 printf() 用于本机代码)永远不应使用。 System.outSystem.err 被重定向到 /dev/null,因此您的打印语句将没有可见的效果。但是,为这些调用发生的所有字符串构建仍然会被执行。

【问题讨论】:

  • 这个建议只针对安卓源吗?

标签: android logging


【解决方案1】:

您应该使用android.util.Log 类。

下面是Log 类的作用的描述:

用于发送日志输出的 API。

一般情况下,您应该使用Log.v()Log.d()Log.i()Log.w()Log.e() 方法写入日志。然后你可以view the logs in logcat

详细程度从少到多的顺序是 ERROR、WARN、INFO、DEBUG、VERBOSE。除非在开发期间,否则永远不应将详细信息编译到应用程序中。调试日志被编译,但在运行时被剥离。始终保留错误、警告和信息日志。

这些是Log 类的可用方法:

  1. Log.d() - 发送 DEBUG 日志消息。
  2. Log.e() - 发送 ERROR 日志消息。
  3. Log.i() - 发送 INFO 日志消息。
  4. Log.v() - 发送 VERBOSE 日志消息。
  5. Log.w() - 发送 WARN 日志消息。
  6. Log.wtf() - 多么可怕的失败:报告一个不应该发生的异常。

上述方法(Log.wLog.wtf 除外,它们有 3 种可能的参数模式)需要以下参数:

  1. String tag, String msg:

    tag:用于标识日志消息的来源。这个值可能是null

    msg:您希望记录的消息。这个值可能是null

  2. String tag, String msg, Throwable tr - 类似于第一个模式,但允许指定异常。如果您想在日志输出中记录异常,则应使用此模式。

  3. (对于Log.wLog.wtfString tag, Throwable tr 类似于第三种模式,但不允许指定消息。请注意,您仍然可以传递消息,但它应该在第二个参数排列中。


编辑:直接回答您的问题:System.outSystem.err 中的 println() 仍将显示在 logcat 中,但有限制。

  • 您无法使用System.outSystem.err 登录VERBOSEERRORDEBUG
  • 您不能定义自己的标签,它会在您的文本中显示System.errSystem.out。例如:

    • System.out.println("Hello!") 等价于 Log.i("System.out","Hello!")
    • System.err.println("Hello!") 等价于 Log.w("System.err","Hello!")

【讨论】:

【解决方案2】:

System.out.println("") 在 android 中将无法正常运行,因为没有将应用程序更正到的终端。

你最好使用Log.(d)(v)(e)(i)(w),因为有一些东西在积极监控 LogCat。

System.out.println() 将打印到 LogCat,但仅在一组额外的系统指令之后,使其效率不高,但是,正如我所说,它仍然有效。

【讨论】:

    【解决方案3】:

    如果我们要跟踪 android 项目
    我们可以使用 Log 类
    有一些方法,如
    Log.e(标签,消息)
    Log.v(标签,消息)
    日志.w(标签,消息)
    Log.d(标签,消息)
    Log.i(标签,消息)
    它是 Utils 包的静态方法。一行一行的放上来,你就可以在 LogCat 中观看了..
    这就是享受 android

    【讨论】:

      【解决方案4】:

      来自您自己的链接:

      System.out.println()(或本地代码的 printf())永远不应该 用过的。 System.out 和 System.err 被重定向到 /dev/null,所以你的 print 语句将没有可见的效果。然而,所有的字符串 为这些调用发生的构建仍然会被执行。

      此外,在该页面的开头,它说:

      以下规则不是指南或建议,而是严格的 规则。对 Android 的贡献一般不会被接受,如果他们 不要遵守这些规则。

      所以不要这样做!

      【讨论】:

      • 这如何回答“为什么”的问题?
      • @LarsH,好吧,我认为那里有足够的理由。我没有在 Android 所说的内容中添加任何内容作为原因。很清楚为什么IMO。它没有明显的效果,但仍需要处理时间。如果我错过了什么,那就是“如何”,就他们应该使用什么来代替日志记录而言。有时间我会补充一点。
      • 是的,Android 文档的第一条引文解释了原因,并且该引文是原始问题的一部分。您的回答只添加了另一个引用“不要!”但没有添加任何关于原因的内容。因此我的评论。你是对的,尽管 OP 本质上也问“如何”。当然,您可以对此添加一些内容,但我认为其他答案已经很好地涵盖了它(即使用Log.*())。
      • 但它确实有效?也许在没有人注意的情况下对框架进行了安静的添加?我有一个新手开发人员为我工作,他在我阻止他之前抛出了几个 System.out.println() 调用,它在 LogCat (Eclipse) 中显示得很好,不需要“标签”参数。
      • @WilliamT.Mallard,是的。实际上,我昨天看到了一篇帖子,声称他们没有从他们的System.out.println 声明中看到任何内容,但我说的例外是 - 这是调试 Android 的可靠方法......他们说这对他们来说很好用。据我所知,它通过Log.i 重新路由,但可能并不比我猜想的更可靠......
      【解决方案5】:

      您可以使用内置的Log utility,它将直接打印到 LogCat。

      您可以使用Log.e(String, String) 来处理以红色显示的错误。还有vdiw分别用于详细、调试、信息和警告。

      【讨论】:

        【解决方案6】:

        以下应该可以打印异常

        1. Log.d("myapp", Log.getStackTraceString(new Exception()));

        2.您可以通过深入挖掘获得更长的堆栈跟踪。例如:

        Log.getStackTraceString(e.getCause().getCause());

        【讨论】:

          【解决方案7】:

          日志是追踪我们的 android 项目的最佳方式
          像下面的代码...
          它会帮助你...
          只需在 DDMS logCat 中查看项目的具体构建方式...
          要求... android.utils.Log;包被使用..

          @Override
          protected void onCreate(Bundle savedInstanceState)
          {
          super.onCreate(savedInstanceState);
          setContentView(R.layout.activity_main);
          for(int i=0;i {
          Log.e("i = ",""+i);
          Log.v("i = ",""+i);
          Log.i("i = ",""+i);
          Log.w("i = ",""+i);
          Log.d("i = ",""+i);
          }
          }

          希望对你有帮助

          【讨论】:

            猜你喜欢
            • 2011-01-14
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2010-09-18
            • 2010-12-22
            • 2010-10-07
            相关资源
            最近更新 更多