「System.out.println」がAndroidで機能しないのはなぜですか?


191

デバッグできるように、コンソールで何かを印刷したいのですが。しかし、何らかの理由で、私のAndroidアプリケーションには何も印刷されません。

どうすればデバッグできますか?

public class HelloWebview extends Activity {
    WebView webview;    
    private static final String LOG_TAG = "WebViewDemo";
    private class HelloWebViewClient extends WebViewClient {
        @Override
        public boolean shouldOverrideUrlLoading(WebView view, String url) {
            view.loadUrl(url);
            return true;
        }
    }

    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        webview = (WebView) findViewById(R.id.webview);
        webview.setWebViewClient(new HelloWebViewClient());
        webview.getSettings().setJavaScriptEnabled(true);
        webview.setWebChromeClient(new MyWebChromeClient());
        webview.loadUrl("http://example.com/");    
        System.out.println("I am here");
    }

4
以下に回答がありますが、SOPステートメントの出力がLogCatにも
送信さ

1
0.9以前はSystem.outが失われたと思います。logcat出力に渡された後:code.google.com/p/android/issues/detail?id=92。(System.outを使用している既存のライブラリなどを使用している場合は、それがAndroidの新しいバージョンのlogcatに表示されます。)
Charlie Collins

Logcat内にSystem.out.printlnsが表示されます。
rDroid

回答:


211

補正:

エミュレータとほとんどのデバイスでSystem.out.printlnは、LogCatにリダイレクトされ、を使用して印刷されLog.i()ます。これは、非常に古いまたはカスタムのAndroidバージョンでは当てはまらない場合があります。

元の:

メッセージを送信するコンソールがないため、System.out.printlnメッセージは失われます。同様に、これを「従来の」Javaアプリケーションをで実行した場合にも起こりますjavaw

代わりに、Android Logクラスを使用できます。

Log.d("MyApp","I am here");

その後、Eclipse のLogcatビューで、または次のコマンドを実行して、ログを表示できます。

adb logcat

キャッチされていない例外のスタックトレースが表示される場所でもあるので、logcatの出力を確認する習慣をつけるとよいでしょう。

すべてのロギング呼び出しの最初のエントリは、ログメッセージのソースを識別するログタグです。ログの出力をフィルタリングしてメッセージのみを表示できるため、これは役立ちます。ログタグとの整合性を確保するには、static final Stringどこかで定義するのがおそらく最善です。

Log.d(MyActivity.LOG_TAG,"Application started");

Log次のレベルに対応する5つの1文字メソッドがあります。

  • e() -エラー
  • w() -警告
  • i() - 情報
  • d() -デバッグ
  • v() -冗長
  • wtf() -なんてひどい失敗

ドキュメントにはレベルについて次のことを言います

開発中を除き、詳細をアプリケーションにコンパイルしないでください。デバッグログはコンパイルされますが、実行時に削除されます。エラー、警告、情報ログは常に保持されます。


30
実際-System.outはLog.i()を介してLogCatに出力します。
kaspermoerch 2011

7
@JosephEarl-[編集]ボタンを自由に使用してください。
Dave Webb

10
Log.wtf():-)もあります
Zorb 14

2
System.out.printlnは、Android StudioのAndroid Monitorの下に表示されます。これらは「I / System.out」として表示されます
PVS

新しいコンソールアドインライブラリも非常に便利です。
PaulMcG 2016


13

はい、そうです。エミュレータを使用している場合は、System.outタグの下のLogcatビューに表示されます。何か書いてエミュレータで試してみてください。


2
この回答に加えて、「何かが起こる」ことがあり、System.outの使用法では入力が印刷されない場合があることに注意してください。この場合は、エミュレータを閉じて再起動してください。これでうまくいきました。
Byron Gavras

1

もちろん、logcatで結果を表示するには、少なくともログレベルを "Info"(logcatのログレベル)に設定する必要があります。そうしないと、私に起こったように、出力が表示されません。


1

System.out.printlnが機能する必要がある場合(たとえば、サードパーティのライブラリから呼び出されます)。リフレクションを使用して、System.classのフィールドを変更できます。

try{
    Field outField = System.class.getDeclaredField("out");
    Field modifiersField = Field.class.getDeclaredField("accessFlags");
    modifiersField.setAccessible(true);
    modifiersField.set(outField, outField.getModifiers() & ~Modifier.FINAL);
    outField.setAccessible(true);
    outField.set(null, new PrintStream(new RedirectLogOutputStream()); 
}catch(NoSuchFieldException e){
    e.printStackTrace(); 
}catch(IllegalAccessException e){
    e.printStackTrace(); 
}

RedirectLogOutputStreamクラス:

public class RedirectLogOutputStream extends OutputStream{
    private String mCache;

    @Override
    public void write(int b) throws IOException{
        if(mCache == null) mCache = "";

        if(((char) b) == '\n'){
            Log.i("redirect from system.out", mCache);
            mCache = "";
        }else{
            mCache += (char) b;
        }
    }
}

1

アプリケーションには表示されません...エミュレータのlogcatの下にあります


1
これは、OPの最初の文「コンソールで何かを印刷したい」
ファリッド

0

あなたが読むことができるあなたの携帯電話上の場所はありません System.out.println();

代わりに、何かの結果を表示したい場合は、logcat/consoleウィンドウを確認するToastか、またはSnackbar(新しいデバイスを使用している場合は)a またはaをデバイスの画面に次のメッセージとともに表示します:)たとえば、switch caseコードのどこにあるのか!コーディングを楽しんでください!:)


1
をクリックしてをクリックするAndroid Monitorと、logcat常に多くのメッセージが出力されるのがわかります。次に、自分のデバッグメッセージをどのように表示しますか?

私は他のものをスクロールするだけでそれを見つけます:D
Valentin Filyov


0

これはメインのスレッドができなかったので、今後の訪問者のために残しておきますSystem.out.println

public class LogUtil {

private static String log = "";
private static boolean started = false;
public static void print(String s) {
    //Start the thread unless it's already running
    if(!started) {
        start();
    }
    //Append a String to the log
    log += s;
}

public static void println(String s) {
    //Start the thread unless it's already running
    if(!started) {
        start();
    }
    //Append a String to the log with a newline.
    //NOTE: Change to print(s + "\n") if you don't want it to trim the last newline.
    log += (s.endsWith("\n") )? s : (s + "\n");
}

private static void start() {
    //Creates a new Thread responsible for showing the logs.
    Thread thread = new Thread(new Runnable() {
        @Override
        public void run() {
            while(true) {
                //Execute 100 times per second to save CPU cycles.
                try {
                    Thread.sleep(10);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                //If the log variable has any contents...
                if(!log.isEmpty()) {
                    //...print it and clear the log variable for new data.
                    System.out.print(log);
                    log = "";
                }
            }
        }
    });
    thread.start();
    started = true;
}
}

使用法: LogUtil.println("This is a string");


-5

最近、Android Studio 3.3でも同じ問題に気づきました。他のAndroidスタジオプロジェクトを閉じたところ、Logcatが機能し始めました。上記の受け入れられた答えはまったく論理的ではありません。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.