HTTPステータス 500 エラーの調査及び解決方法を教えてください


Javaの経験は浅いです。  
Apache Tomcat/6.0.20 直下のlogを見ましたけど、特に異常はなさそうです。  
下記のエラーの解消方法を教えていただけますか？

**HTTPステータス**

> 500 -

**type 例外レポート メッセージ**

**説明**

> The server encountered an internal error () that prevented it from
> fulfilling this request.

**例外**

[code]

    java.lang.StringIndexOutOfBoundsException: String index out of range: -9
    java.lang.String.substring(String.java:1938)
    java.lang.String.substring(String.java:1905)
    pds.document.provider.PosFile.parseTag(PosFile.java:104)
    pds.document.provider.PatentDocument.init(PatentDocument.java:66)
    pds.servlet.ShowPatentDocument.showPatentDocumentImpl(ShowPatentDocument.java:116)
    pds.servlet.ShowPatentDocument.doPost(ShowPatentDocument.java:74)
    pds.servlet.ShowPatentDocument.doGet(ShowPatentDocument.java:38)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:617)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
    
[/code]

**注意**

> 原因のすべてのスタックトレースは、Apache Tomcat/6.0.20のログに記録されています




Tomcatを使っていてHTTPステータス500エラーが出るのは、大抵の場合は、デプロイしたWebアプリにバグがあるか、何らかの設定が誤っているかのいずれかです。

具体的な原因を知るためには出力されたログを解析する必要があります。  
本件質問のスタックトレースで注目すべき箇所は次のところです。

[code]

    java.lang.StringIndexOutOfBoundsException: String index out of range: -9
    java.lang.String.substring(String.java:1938)
     :
    pds.document.provider.PosFile.parseTag(PosFile.java:104)
    pds.document.provider.PatentDocument.init(PatentDocument.java:66)
    
[/code]

エラーが出た直接の原因は

[code]

    java.lang.StringIndexOutOfBoundsException: String index out of range: -9
    java.lang.String.substring(String.java:1938)
    
[/code]

とあるように、文字列の中をsubstring()で参照しようとしたときに負の値を指定したことによるものです。  
[Java API String
substring](http://docs.oracle.com/javase/jp/8/docs/api/java/lang/String.html#substring-
int-)

ではどこで負の値を指定したのかというと、

[code]

    pds.document.provider.PosFile.parseTag(PosFile.java:104)
    
[/code]

となっているので `PosFile.java` の104行目の可能性が高いです。  
おそらく`PosFile.parseTag()`メソッドに何らかのバグがあるのでしょう。あるいは`parseTag()`メソッドに渡される引数に誤りがあるのでしょう。具体的なことは該当するソースを見ないとわかりません。  
もしかすると、クラス名やメソッド名から察するにposファイルとやらの内容を解析しているようなので、そのposファイル自体が本来満たしているべき規約や規格に添っていない可能性もあります。

* * *

スタックトレースの見方については以下のリンクが参考になると思います。

  * [デバッグのヒント教えます（2）：スタックトレースからデバッグのヒントを読み取る - ＠IT](http://www.atmarkit.co.jp/ait/articles/0605/20/news012.html)

