スタックトレースとは何ですか?それを使用してアプリケーションエラーをデバッグするにはどうすればよいですか?

674
Rob Hruska 2010-10-22 04:52.

アプリケーションを実行すると、次のようなエラーが発生することがあります。

Exception in thread "main" java.lang.NullPointerException
        at com.example.myproject.Book.getTitle(Book.java:16)
        at com.example.myproject.Author.getBookTitles(Author.java:25)
        at com.example.myproject.Bootstrap.main(Bootstrap.java:14)

人々はこれを「スタックトレース」と呼んでいます。スタックトレースとは何ですか?私のプログラムで起こっているエラーについて何を教えてくれますか?


この質問について-初心者プログラマーが「エラーを取得」しているところに質問が来ることがよくあります。スタックトレースとは何か、またはスタックトレースの使用方法を理解せずに、スタックトレースとランダムなコードブロックを貼り付けるだけです。この質問は、スタックトレースの値を理解するのに助けが必要な初心者プログラマーのためのリファレンスとして意図されています。

7 answers

623
Rob Hruska 2010-10-22 04:52.

簡単に言うと、スタックトレースは、例外がスローされたときにアプリケーションが途中で行ったメソッド呼び出しのリストです。

簡単な例

質問の例を使用すると、アプリケーションのどこで例外がスローされたかを正確に判断できます。スタックトレースを見てみましょう。

Exception in thread "main" java.lang.NullPointerException
        at com.example.myproject.Book.getTitle(Book.java:16)
        at com.example.myproject.Author.getBookTitles(Author.java:25)
        at com.example.myproject.Bootstrap.main(Bootstrap.java:14)

これは非常に単純なスタックトレースです。「at ...」のリストの最初から始めると、エラーが発生した場所がわかります。私たちが探しているのは、アプリケーションの一部である最上位のメソッド呼び出しです。この場合、次のようになります。

at com.example.myproject.Book.getTitle(Book.java:16)

これをデバッグするために、次の行を開いてBook.java確認できます16

15   public String getTitle() {
16      System.out.println(title.toString());
17      return title;
18   }

これは、何か(おそらくtitle)がnull上記のコードに含まれていることを示します。

一連の例外の例

アプリケーションが例外をキャッチし、別の例外の原因として再スローする場合があります。これは通常、次のようになります。

34   public void getBookIds(int id) {
35      try {
36         book.getId(id);    // this method it throws a NullPointerException on line 22
37      } catch (NullPointerException e) {
38         throw new IllegalStateException("A book has a null property", e)
39      }
40   }

これにより、次のようなスタックトレースが得られる可能性があります。

Exception in thread "main" java.lang.IllegalStateException: A book has a null property
        at com.example.myproject.Author.getBookIds(Author.java:38)
        at com.example.myproject.Bootstrap.main(Bootstrap.java:14)
Caused by: java.lang.NullPointerException
        at com.example.myproject.Book.getId(Book.java:22)
        at com.example.myproject.Author.getBookIds(Author.java:36)
        ... 1 more

これの違いは「原因」です。例外には、複数の「原因」セクションがある場合があります。これらの場合、通常、スタックトレースで最も低い「原因」セクションの1つである「根本原因」を見つける必要があります。私たちの場合、それは次のとおりです。

Caused by: java.lang.NullPointerException <-- root cause
        at com.example.myproject.Book.getId(Book.java:22) <-- important line

繰り返しますが、これは例外で、私たちはラインを見てみたいと思います22Book.java原因となる可能性があるか見てNullPointerExceptionここに。

ライブラリコードを使用したさらに困難な例

通常、スタックトレースは、上記の2つの例よりもはるかに複雑です。次に例を示します(長い例ですが、連鎖例外のいくつかのレベルを示しています)。

javax.servlet.ServletException: Something bad happened
    at com.example.myproject.OpenSessionInViewFilter.doFilter(OpenSessionInViewFilter.java:60)
    at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157) at com.example.myproject.ExceptionHandlerFilter.doFilter(ExceptionHandlerFilter.java:28) at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157)
    at com.example.myproject.OutputBufferFilter.doFilter(OutputBufferFilter.java:33)
    at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157) at org.mortbay.jetty.servlet.ServletHandler.handle(ServletHandler.java:388) at org.mortbay.jetty.security.SecurityHandler.handle(SecurityHandler.java:216) at org.mortbay.jetty.servlet.SessionHandler.handle(SessionHandler.java:182) at org.mortbay.jetty.handler.ContextHandler.handle(ContextHandler.java:765) at org.mortbay.jetty.webapp.WebAppContext.handle(WebAppContext.java:418) at org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:152) at org.mortbay.jetty.Server.handle(Server.java:326) at org.mortbay.jetty.HttpConnection.handleRequest(HttpConnection.java:542) at org.mortbay.jetty.HttpConnection$RequestHandler.content(HttpConnection.java:943)
    at org.mortbay.jetty.HttpParser.parseNext(HttpParser.java:756)
    at org.mortbay.jetty.HttpParser.parseAvailable(HttpParser.java:218)
    at org.mortbay.jetty.HttpConnection.handle(HttpConnection.java:404)
    at org.mortbay.jetty.bio.SocketConnector$Connection.run(SocketConnector.java:228) at org.mortbay.thread.QueuedThreadPool$PoolThread.run(QueuedThreadPool.java:582)
Caused by: com.example.myproject.MyProjectServletException
    at com.example.myproject.MyServlet.doPost(MyServlet.java:169)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:727)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:820)
    at org.mortbay.jetty.servlet.ServletHolder.handle(ServletHolder.java:511)
    at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1166) at com.example.myproject.OpenSessionInViewFilter.doFilter(OpenSessionInViewFilter.java:30) ... 27 more Caused by: org.hibernate.exception.ConstraintViolationException: could not insert: [com.example.myproject.MyEntity] at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:96) at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:66) at org.hibernate.id.insert.AbstractSelectingDelegate.performInsert(AbstractSelectingDelegate.java:64) at org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:2329) at org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:2822) at org.hibernate.action.EntityIdentityInsertAction.execute(EntityIdentityInsertAction.java:71) at org.hibernate.engine.ActionQueue.execute(ActionQueue.java:268) at org.hibernate.event.def.AbstractSaveEventListener.performSaveOrReplicate(AbstractSaveEventListener.java:321) at org.hibernate.event.def.AbstractSaveEventListener.performSave(AbstractSaveEventListener.java:204) at org.hibernate.event.def.AbstractSaveEventListener.saveWithGeneratedId(AbstractSaveEventListener.java:130) at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.saveWithGeneratedOrRequestedId(DefaultSaveOrUpdateEventListener.java:210) at org.hibernate.event.def.DefaultSaveEventListener.saveWithGeneratedOrRequestedId(DefaultSaveEventListener.java:56) at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.entityIsTransient(DefaultSaveOrUpdateEventListener.java:195) at org.hibernate.event.def.DefaultSaveEventListener.performSaveOrUpdate(DefaultSaveEventListener.java:50) at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.onSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:93) at org.hibernate.impl.SessionImpl.fireSave(SessionImpl.java:705) at org.hibernate.impl.SessionImpl.save(SessionImpl.java:693) at org.hibernate.impl.SessionImpl.save(SessionImpl.java:689) at sun.reflect.GeneratedMethodAccessor5.invoke(Unknown Source) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) at java.lang.reflect.Method.invoke(Method.java:597) at org.hibernate.context.ThreadLocalSessionContext$TransactionProtectionWrapper.invoke(ThreadLocalSessionContext.java:344)
    at $Proxy19.save(Unknown Source)
    at com.example.myproject.MyEntityService.save(MyEntityService.java:59) <-- relevant call (see notes below)
    at com.example.myproject.MyServlet.doPost(MyServlet.java:164)
    ... 32 more
Caused by: java.sql.SQLException: Violation of unique constraint MY_ENTITY_UK_1: duplicate value(s) for column(s) MY_COLUMN in statement [...]
    at org.hsqldb.jdbc.Util.throwError(Unknown Source)
    at org.hsqldb.jdbc.jdbcPreparedStatement.executeUpdate(Unknown Source)
    at com.mchange.v2.c3p0.impl.NewProxyPreparedStatement.executeUpdate(NewProxyPreparedStatement.java:105)
    at org.hibernate.id.insert.AbstractSelectingDelegate.performInsert(AbstractSelectingDelegate.java:57)
    ... 54 more

この例では、さらに多くのことがあります。私たちが最も懸念しているのは、コードからのメソッドを探すことです。これは、com.example.myprojectパッケージ内のすべてのものです。2番目の例(上記)から、最初に根本原因を調べたいと思います。それは次のとおりです。

Caused by: java.sql.SQLException

ただし、その下のすべてのメソッド呼び出しはライブラリコードです。その上にある「Causedby」に移動し、コードから発生した最初のメソッド呼び出しを探します。これは次のとおりです。

at com.example.myproject.MyEntityService.save(MyEntityService.java:59)

前の例のように、このエラーが発生した場所であるため、MyEntityService.javaオンライン59で確認する必要があります(SQLExceptionがエラーを示しているため、これは問題が発生したことは少し明らかですが、デバッグ手順が目的です)。

82
Dakkaron 2015-10-15 00:40.

私はこの回答を投稿しているので、一番上の回答(アクティビティでソートした場合)は単に間違っているものではありません。

スタックトレースとは何ですか?

スタックトレースは非常に便利なデバッグツールです。キャッチされなかった例外がスローされたとき(またはスタックトレースが手動で生成されたとき)の呼び出しスタック(つまり、その時点までに呼び出された関数のスタック)が表示されます。これは、エラーが発生した場所だけでなく、プログラムがコードのその場所でどのように終了したかを示すため、非常に便利です。これは次の質問につながります:

例外とは何ですか?

例外は、ランタイム環境がエラーが発生したことを通知するために使用するものです。一般的な例は、NullPointerException、IndexOutOfBoundsException、またはArithmeticExceptionです。これらのそれぞれは、あなたが不可能なことをしようとしたときに引き起こされます。たとえば、Nullオブジェクトを逆参照しようとすると、NullPointerExceptionがスローされます。

Object a = null;
a.toString();                 //this line throws a NullPointerException

Object[] b = new Object[5];
System.out.println(b[10]);    //this line throws an IndexOutOfBoundsException,
                              //because b is only 5 elements long
int ia = 5;
int ib = 0;
ia = ia/ib;                   //this line throws an  ArithmeticException with the 
                              //message "/ by 0", because you are trying to
                              //divide by 0, which is not possible.

Stacktraces / Exceptionsをどのように処理する必要がありますか?

最初に、例外の原因を突き止めます。例外の名前をグーグルで検索して、その例外の原因を調べてください。ほとんどの場合、コードが正しくないことが原因です。上記の例では、すべての例外は誤ったコードが原因で発生します。したがって、NullPointerExceptionの例でaは、その時点でnullにならないようにすることができます。たとえば、a次のようなチェックを初期化または含めることができます。

if (a!=null) {
    a.toString();
}

このように、問題のある行は、の場合は実行されませんa==null。他の例についても同じことが言えます。

例外が発生しないことを確認できない場合があります。たとえば、プログラムでネットワーク接続を使用している場合、コンピューターがインターネット接続を失うのを防ぐことはできません(たとえば、ユーザーがコンピューターのネットワーク接続を切断するのを止めることはできません)。この場合、ネットワークライブラリはおそらく例外をスローします。ここで、例外をキャッチして処理する必要があります。つまり、ネットワーク接続の例では、接続を再開するか、ユーザーなどに通知する必要があります。また、catchを使用する場合は常に、キャッチしたい例外のみをキャッチします。すべての例外をキャッチするような広範なcatchステートメントは使用しないcatch (Exception e)ください。これは非常に重要です。そうしないと、誤って間違った例外をキャッチし、間違った方法で反応する可能性があるためです。

try {
    Socket x = new Socket("1.1.1.1", 6789);
    x.getInputStream().read()
} catch (IOException e) {
    System.err.println("Connection could not be established, please try again later!")
}

なぜ使用しないのcatch (Exception e)ですか?

小さな例を使用して、すべての例外をキャッチするだけではいけない理由を示しましょう。

int mult(Integer a,Integer b) {
    try {
        int result = a/b
        return result;
    } catch (Exception e) {
        System.err.println("Error: Division by zero!");
        return 0;
    }
}

何このコードが何をしようとしていることはキャッチすることですArithmeticException0で除算可能に起因するしかし、それはまた、可能キャッチしNullPointerExceptionた場合にスローされているaか、bですがnull。つまり、が発生する可能性がありますが、NullPointerExceptionそれをArithmeticExceptionとして扱い、おそらく間違ったことをします。最良の場合でも、NullPointerExceptionがあったことを見逃します。そのようなものはデバッグをはるかに難しくするので、そうしないでください。

TLDR

  1. 例外の原因を特定して修正し、例外がまったくスローされないようにします。
  2. 1.が不可能な場合は、特定の例外をキャッチして処理します。

    • try / catchを追加して、例外を無視しないでください。そうしないでください!
    • 使用しないでくださいcatch (Exception e)。常に特定の例外をキャッチしてください。それはあなたに多くの頭痛を救うでしょう。
21
Woot4Moo 2010-10-22 05:05.

ロブが言ったことに追加する。アプリケーションにブレークポイントを設定すると、スタックを段階的に処理できます。これにより、開発者はデバッガーを使用して、メソッドが予期しないことを実行している正確なポイントを確認できます。

RobはNullPointerException(NPE)を使用して一般的なことを説明しているため、次の方法でこの問題を取り除くことができます。

次のようなパラメータを受け取るメソッドがある場合: void (String firstName)

私たちのコードでfirstNameは、値を含む評価を行いたいので、次のようにします。if(firstName == null || firstName.equals("")) return;

上記はfirstName、安全でないパラメータとして使用することを防ぎます。したがって、処理の前にnullチェックを実行することで、コードが正しく実行されることを確認できます。メソッドでオブジェクトを利用する例を拡張するために、ここを見ることができます:

if(dog == null || dog.firstName == null) return;

上記はnullをチェックする適切な順序です。ベースオブジェクト(この場合はdog)から始めて、処理の前にすべてが有効であることを確認するために可能性のツリーを歩き始めます。順序が逆になると、NPEがスローされる可能性があり、プログラムがクラッシュします。

15
przemek hertel 2014-09-17 07:34.

Throwableファミリによって提供されるもう1つのスタックトレース機能があります。スタックトレース情報を操作する可能性です。

標準的な動作:

package test.stack.trace;

public class SomeClass {

    public void methodA() {
        methodB();
    }

    public void methodB() {
        methodC();
    }

    public void methodC() {
        throw new RuntimeException();
    }

    public static void main(String[] args) {
        new SomeClass().methodA();
    }
}

スタックトレース:

Exception in thread "main" java.lang.RuntimeException
    at test.stack.trace.SomeClass.methodC(SomeClass.java:18)
    at test.stack.trace.SomeClass.methodB(SomeClass.java:13)
    at test.stack.trace.SomeClass.methodA(SomeClass.java:9)
    at test.stack.trace.SomeClass.main(SomeClass.java:27)

操作されたスタックトレース:

package test.stack.trace;

public class SomeClass {

    ...

    public void methodC() {
        RuntimeException e = new RuntimeException();
        e.setStackTrace(new StackTraceElement[]{
                new StackTraceElement("OtherClass", "methodX", "String.java", 99),
                new StackTraceElement("OtherClass", "methodY", "String.java", 55)
        });
        throw e;
    }

    public static void main(String[] args) {
        new SomeClass().methodA();
    }
}

スタックトレース:

Exception in thread "main" java.lang.RuntimeException
    at OtherClass.methodX(String.java:99)
    at OtherClass.methodY(String.java:55)
15
Kevin Li 2016-07-26 16:24.

名前を理解するには:スタックトレースは、最も表面的な例外(例:サービスレイヤー例外)から最も深い例外(例:データベース例外)までの例外のリスト(または「原因」のリストと言うことができます)です。これを「スタック」と呼ぶ理由と同じように、スタックは後入れ先出し(FILO)であるため、最も深い例外が最初に発生し、その後、一連の例外が生成され、一連の結果が生成されました。 1つは時間内に発生しましたが、そもそもそれがわかります。

重要1:ここで理解する必要のあるトリッキーで重要なことは次のとおりです。最も深い原因は「根本原因」ではない可能性があります。「悪いコード」を書くと、その下にそのレイヤーよりも深い例外が発生する可能性があるためです。たとえば、SQLクエリが正しくないと、スタックの真ん中にある可能性があるsyndaxエラーではなく、下部でSQLServerException接続がリセットされる可能性があります。

->真ん中の根本原因を見つけるのはあなたの仕事です。

キー2:もう1つのトリッキーですが重要なことは、各「Cause by」ブロック内にあります。最初の行は最も深いレイヤーであり、このブロックの最初の場所で発生します。例えば、

Exception in thread "main" java.lang.NullPointerException
        at com.example.myproject.Book.getTitle(Book.java:16)
           at com.example.myproject.Author.getBookTitles(Author.java:25)
               at com.example.myproject.Bootstrap.main(Bootstrap.java:14)

Book.java:16はBootstrap.java:14によって呼び出されたAuther.java:25によって呼び出され、Book.java:16が根本的な原因でした。ここに図を添付して、トレーススタックを時系列で並べ替えます。

8
Eugene S 2016-04-19 17:43.

他の例に追加するために、記号とともに表示れる内部(ネストされた)クラスがあります$。例えば:

public class Test {

    private static void privateMethod() {
        throw new RuntimeException();
    }

    public static void main(String[] args) throws Exception {
        Runnable runnable = new Runnable() {
            @Override public void run() {
                privateMethod();
            }
        };
        runnable.run();
    }
}

結果は次のスタックトレースになります。

Exception in thread "main" java.lang.RuntimeException
        at Test.privateMethod(Test.java:4)
        at Test.access$000(Test.java:1)
        at Test$1.run(Test.java:10)
        at Test.main(Test.java:13)
6
rghome 2015-03-12 23:34.

他の投稿では、スタックトレースとは何かについて説明していますが、それでも操作が難しい場合があります。

スタックトレースを取得し、例外の原因を追跡したい場合は、それを理解するための良い出発点は、EclipseのJavaスタックトレースコンソールを使用することです。別のIDEを使用する場合、同様の機能があるかもしれませんが、この答えはEclipseに関するものです。

まず、EclipseプロジェクトですべてのJavaソースにアクセスできることを確認します。

次に、Javaパースペクティブで、[コンソール]タブ(通常は下部)をクリックします。コンソールビューが表示されていない場合は、メニューオプション[ウィンドウ] -> [ビューの表示]に移動し、[コンソール]を選択します。

次に、コンソールウィンドウで、次のボタン(右側)をクリックします。

次に、ドロップダウンリストから[ Java Stack TraceConsole]を選択します。

スタックトレースをコンソールに貼り付けます。次に、ソースコードおよびその他の利用可能なソースコードへのリンクのリストが提供されます。

これはあなたが見るかもしれないものです(Eclipseドキュメントからの画像):

作られた最新のメソッド呼び出しは次のようになりますトップ(メッセージテキストを除く)トップラインであるスタックの。スタックを下に行くと、過去にさかのぼります。2行目は、1行目などを呼び出すメソッドです。

オープンソースソフトウェアを使用している場合、調査したい場合は、ソースをダウンロードしてプロジェクトに添付する必要があるかもしれません。ソースjarをダウンロードし、プロジェクトで[参照ライブラリ]フォルダーを開いてオープンソースモジュール(クラスファイルを含む)のjarを見つけ、右クリックして[プロパティ]を選択し、ソースjarを添付します

Related questions

MORE COOL STUFF

「水曜日」シーズン1の中心には大きなミステリーがあります

「水曜日」シーズン1の中心には大きなミステリーがあります

Netflixの「水曜日」は、典型的な10代のドラマ以上のものであり、実際、シーズン1にはその中心に大きなミステリーがあります.

ボディーランゲージの専門家は、州訪問中にカミラ・パーカー・ボウルズが輝くことを可能にした微妙なケイト・ミドルトンの動きを指摘しています

ボディーランゲージの専門家は、州訪問中にカミラ・パーカー・ボウルズが輝くことを可能にした微妙なケイト・ミドルトンの動きを指摘しています

ケイト・ミドルトンは、州の夕食会と州の訪問中にカミラ・パーカー・ボウルズからスポットライトを奪いたくなかった、と専門家は言う.

一部のファンがハリー・スタイルズとオリビア・ワイルドの「非常に友好的な」休憩が永続的であることを望んでいる理由

一部のファンがハリー・スタイルズとオリビア・ワイルドの「非常に友好的な」休憩が永続的であることを望んでいる理由

一部のファンが、オリビア・ワイルドが彼女とハリー・スタイルズとの間の「難しい」が「非常に友好的」な分割を恒久的にすることを望んでいる理由を見つけてください.

エリザベス女王の死後、ケイト・ミドルトンはまだ「非常に困難な時期」を過ごしている、と王室の専門家が明らかにする 

エリザベス女王の死後、ケイト・ミドルトンはまだ「非常に困難な時期」を過ごしている、と王室の専門家が明らかにする&nbsp;

エリザベス女王の死後、ケイト・ミドルトンが舞台裏で「非常に困難な時期」を過ごしていたと伝えられている理由を調べてください.

セントヘレナのジェイコブのはしごを登るのは、気弱な人向けではありません

セントヘレナのジェイコブのはしごを登るのは、気弱な人向けではありません

セント ヘレナ島のジェイコブズ ラダーは 699 段の真っ直ぐ上る階段で、頂上に到達すると証明書が発行されるほどの難易度です。

The Secrets of Airline Travel Quiz

The Secrets of Airline Travel Quiz

Air travel is far more than getting from point A to point B safely. How much do you know about the million little details that go into flying on airplanes?

Where in the World Are You? Take our GeoGuesser Quiz

Where in the World Are You? Take our GeoGuesser Quiz

The world is a huge place, yet some GeoGuessr players know locations in mere seconds. Are you one of GeoGuessr's gifted elite? Take our quiz to find out!

バイオニック読書はあなたをより速く読むことができますか?

バイオニック読書はあなたをより速く読むことができますか?

BionicReadingアプリの人気が爆発的に高まっています。しかし、それは本当にあなたを速読術にすることができますか?

引退した一郎:「私はただ死ぬと思う」

引退した一郎:「私はただ死ぬと思う」

写真:リッチシュルツ/ APマーリンズ外野手/野球のトゥルーヒットキング鈴木一郎は43歳ですが、近い将来、プロ野球をやめるつもりはありません。昨年、彼は143試合に出場し、ヒットしました。

12年後、有名なクラブペンギン氷山がついにヒント

12年後、有名なクラブペンギン氷山がついにヒント

約12年間の運用後、ディズニーの子供向けのMMOクラブペンギンは閉店しますが、プレーヤーがゲームで最も長く実行されているミームの1つを実現する機会を得る前ではありません。氷山がひっくり返った。

安い航空券はあなたが思っているほどお得ではありません

安い航空券はあなたが思っているほどお得ではありません

お気に入りのレストランが割引価格で食事を提供し始めたが、ナプキン、フォーク、または座席が必要な場合は追加料金を支払う必要があるとします。私たちのほとんどはおそらく彼らに私たちのビジネスを与えることを躊躇するでしょうが、その躊躇は航空運賃に変換されません。

注意してください、あなたが話す次の男はUFCファイターかもしれません

注意してください、あなたが話す次の男はUFCファイターかもしれません

マークハントはUFCで最もヘビーな打者かもしれません。彼はほぼ間違いなく、現在オーストラリアに住んでいる最もタフなファイターです。

ケイト・ミドルトンとウィリアム王子は、彼らが子供たちと行っているスパイをテーマにした活動を共有しています

ケイト・ミドルトンとウィリアム王子は、彼らが子供たちと行っているスパイをテーマにした活動を共有しています

ケイト・ミドルトンとウィリアム王子は、子供向けのパズルの本の序文を書き、ジョージ王子、シャーロット王女、ルイ王子と一緒にテキストを読むと述べた.

事故で押しつぶされたスイカは、動物を喜ばせ水分補給するために野生生物保護団体に寄付されました

事故で押しつぶされたスイカは、動物を喜ばせ水分補給するために野生生物保護団体に寄付されました

Yak's Produce は、数十個のつぶれたメロンを野生動物のリハビリ専門家であるレスリー グリーンと彼女のルイジアナ州の救助施設で暮らす 42 匹の動物に寄付しました。

デミ・ロヴァートは、新しいミュージシャンのボーイフレンドと「幸せで健康的な関係」にあります: ソース

デミ・ロヴァートは、新しいミュージシャンのボーイフレンドと「幸せで健康的な関係」にあります: ソース

8 枚目のスタジオ アルバムのリリースに向けて準備を進めているデミ ロヴァートは、「スーパー グレート ガイ」と付き合っている、と情報筋は PEOPLE に確認しています。

Plathville の Kim と Olivia Plath が数年ぶりに言葉を交わすことへようこそ

Plathville の Kim と Olivia Plath が数年ぶりに言葉を交わすことへようこそ

イーサン プラスの誕生日のお祝いは、TLC のウェルカム トゥ プラスビルのシーズン 4 のフィナーレで、戦争中の母親のキム プラスと妻のオリビア プラスを結びつけました。

安全な公衆パニックルーム

安全な公衆パニックルーム

不気味な音に慣れて、コンクリートの周りをうろつきます。痛みや苦い口を吐き出し、「過ち」の不思議な病気を通してもう一度味わうことを切望します。

長い間行方不明だった 2 つのサンフランシスコ クリークが間もなく日の目を見る可能性がある

都市の水路を回復する理由はたくさんありますが、気候が変化するにつれて、それらはすべてより持続可能な未来につながります.

長い間行方不明だった 2 つのサンフランシスコ クリークが間もなく日の目を見る可能性がある

サンフランシスコの長い間失われた小川を復元する動きが高まっており、コミュニティを地域の生態系と結びつけ、また、都市が気候変動や季節的な洪水に適応するのに役立つ新しいタイプの「グリーン インフラストラクチャ」を作成しています。最新の取り組みは町の 2 つの非常に異なる場所で行われており、それらは明確ではあるが補完的な方法で展開されています。

サンフランシスコのベイエリアで家族写真が撮れる場所トップ 5

サンフランシスコのベイエリアで家族写真が撮れる場所トップ 5

ベイエリアには写真を撮るための美しい屋外スポットがたくさんあります。この記事のすべての写真は、ベイエリアにいるさまざまな PictureHum フォトグラファーとの PictureHum セッションからのものです。

退屈に耐えられないから生きていけない

退屈に耐えられないから生きていけない

それが現代の衝動です — より少ないもので世界を覆し、私たちのほんのわずかな瞬間を自分たちから盗もうとする. 私はかつてダイニングルームのソファで一日を過ごし、祖父母の農家に斜めに差し込む光を眺め、私には関係のない世界について話している大人のつぶやきを半分聞いたり、壁を通してくぐもったテレビを聞いたり、遊んだりしました。床と犬と私の小さな靴を暖めた太陽の黒点と。

Language