ラベル Java の投稿を表示しています。 すべての投稿を表示
ラベル Java の投稿を表示しています。 すべての投稿を表示

2017年2月11日土曜日

JVM入門

Schooの授業メモ
Apache Tomcatチューニング入門


メモ

Java/Tomcatアプリのレスポンスのボトルネック
keep-aliveの見直し、DB設計、SQL見直し
インデックスの見直し、Tomcatのメモリ設定

TomcatもJavaプログラム
知らなかったです。
TomcatもJavaプログラムのため、
物理メモリ → JVM → Tomcat → Webアプリ
という関係性のイメージになる

JVMの仮想メモリ
スタック領域 + ヒープ領域

スタック領域
参照型変数のアドレス参照とプリミティブ型変数を格納する

ヒープ領域
オブジェクトのインスタンスを格納する
実行速度に特に影響が出やすいのが、このヒープ領域

さらにEden領域・Survivor領域・Tenured領域に区切られる。
Eden領域 + Survivor領域 = New領域
Tenured領域 = Old領域ともいう。

Survivor領域については、From空間とTo空間
(Survivor0 / Survivor1)にさらに別れる。

Garbage Collectionの動き
インスタンスを生成して最初に格納されるのが、ヒープ領域のうちのEden領域
Eden領域がいっぱいになると、Scavenge GC(Minor GC)が起動する。
参照されていないインスタンスは破棄し、残りは
Survivor領域のTo空間(Survivor1)に移動する

その後のScavenge GCにおいて、参照されているTo空間のインスタンスは、
From空間(Survivor0)に移動する

デフォルトでは、16回マイナーGCを実行されたインスタンスは、
Tenured領域に移動します。
new領域とOld領域が一杯になるとFull GC(Major GC)が実行され、
一時的にアプリが停止します。
以上のように、GCの対象になるかどうかは参照があるかどうかですが、
GCが実行されるタイミングは、メモリ容量によって決まります。

JVMのプロセスを表示
JVMのプロセスを表示
$ jps
3528 Jps
2554 
3403 Bootstrap
2188 

-vをつけると、実行コマンドを確認できる
$ jps -v
3529 Jps -Dapplication.home=/Library/Java/JavaVirtualMachines/jdk1.8.0_111.jdk/Contents/Home 
-Xms8m
2554  -javaagent:../Eclipse/lombok.jar -Dosgi.requiredJavaVersion=1.8 -Xms40m 

JVMプロセスのメモリ使用状況
jstat -gcutil  3403
  S0     S1     E      O      M     CCS    YGC     YGCT    FGC    FGCT     GCT   
  0.00  68.59  90.99  38.86  96.71  92.41      9    0.121     1    0.059    0.180
FGCがFull GCが発生した回数
FGCが発生していた時間

単発は問題ない(メモリを解放するので悪いことではない)が、
頻発しているとアプリが止まっているので、問題がある
項目の詳細は公式から
  • S0 : Survivor0の使用率
  • S1 : Survivor1の使用率
  • E : Eden領域の使用率
  • O : Old領域の使用率
  • P : Permanent領域(Tenured領域の別名)の使用率
  • M : メタスペースの使用率
  • CCS : 圧縮したクラス領域の使用率
  • YGC : マイナーGCの回数
  • YGCT : マイナーGCの時間
マイナーGC = Young GCの理解ですが、時間があったら確認したい。

Stop The world
Full GCにより一時的にアプリが停止すること(スレッドの停止)

OutOfMemmoryError
Full GCでもメモリ不足が解消できない状態

指定メモリが大きすぎるのも問題
メモリ・CPU・アプリケーションの性能により、
単純にメモリを大きくすれば良いという話ではないらしい。
  • マイナーGCに時間がかかる:New領域が大きすぎる
  • フルGCに時間がかかる:Old領域が大きすぎる

JVMの起動時の設定
  • -Xms:ヒープ領域の起動時のサイズ
  • -Xmx:ヒープ領域の最大サイズ
  • -XX:NewSize:New領域のサイズ
  • -XX:MaxSize:New領域の最大サイズ
  • -XX:SurvivorRatio:From/To領域の使用比率
  • -XX:MaxTenuringThreshold:New領域からOld領域に移動する閾値
  • -XX:TargetSurvivorRatio:Survivor領域の閾値

起動オブションの設定
・引数で渡す
・設定ファイルに書いておく(setenv.sh/setenv.bat)

2017年1月24日火曜日

Java/ org.w3c.dom

Java SE 1.4からある古いパッケージですが、今日初めて知ったので、少しメモ


メモ

Documentインターフェース
スーパーインスタンス:Node
HTML/XMLファイル全体をさすインターフェース。
ドキュメントツリーのルートを格納する。

Elementインターフェース
HTML/XMLファイルの要素のインターフェース

2017年1月22日日曜日

Servlet / JSP 再入門とAWSやLinuxの雑記3

続き


メモ

Spring Tool SuitsにDB Viewerを入れる
パースペティクブ開こうとしたら入っていなかったです。
Eclipse MarketplaceからDLできました。
参考:Small Java World Eclipseの「DBViewer」プラグインを利用して「Java DB」の環境を作成し、SQLを発行してみる

Mac OSXでPostgreSQL立ち上げるのにハマりググる。
クライアントはすぐ見つかるが、サーバ側がなかなか起動できなかった。
失敗した方法:
PostgreSQL 9.0.4文書 17.3. データベースサーバの起動
$ postgres -D /usr/local/pgsql/data >logfile 2>&1 &
Mac OSXでbrewでpostgresqlをインストすると/usr/local/pgsql/dataにconfファイルがないみたいでした。

解決した方法:
Qiita Homebrewを使ったPostgreSQLのインストール(Mac OS Lion)
postgres -D /usr/local/var/postgres

JDBCのダウンロード
まぁ公式から。
Java SDKのバージョンにより、使用するJDBC Driverのバージョンが異なります。
  • 1.6 → JDBC4
  • 1.7 → JDBC4.1
  • 1.6 → JDBC4.2

JDBC API
(Class)java.sql.Drivermanager
: static Connection : getConnection(String url)

(interface)java.sql.Connetion
: static PreparedStatement prepareStatement(String sql)
: void close()

(interface)java.sql.PreparedStatement
: void close()
: ResultSet executeQuery()
: int executeUpdate()
: boolean execute()
: void setString(int parameterIndex, String x)
: void setInt(int parameterIndex, int x)
: void setDouble(int parameterIndex, double x)
: void setDate(int parameterIndex, Date x)

executeQuery(), execute(), executeUpdate()
  • executeQuery() = SQLを実行してResultset型の戻り値を返す
  • execute() = SQLを実行し、完了したかどうかのboolean値を返す
  • executeUpdate() = SQLを実行し、影響があった行数を返す

INパラメータ
PreparedStatmentに埋め込む"?"のこと。
インデックスは1始まり。まぁSQL絡みだから間違えないかな。

ResultSet
(interface)java.sql.ResultSet
: void close()
: boolean next()
: String getString(String columnName)
: int getInt(String columnName)
: double getDouble(String columnName)
: java.sql.Date getDate(string columnName)

JDBCの書き方
Class.forName("org.postgresql.Driver");
Connection con = DriverManager.getConnection
("jdbc:postgresql://localhost:5432/test?user=test&password=test");

PostgreSQLのserialがずれる
独自idカラムをserialかつPrimary Keyにしていたら、Webアプリでレコード追加した際に
idカラムが重複してエラーを起こしていた。シーケンスが、すでにテーブルにある値とずれることがあるらしい。
参考:ぺけみさお PostgreSQLでINSERT時に自動採番の主キーが重複してエラーが出る場合の対処法

JSP / Javaコードに変換されたソースのありか
Eclipseで確認しているのは、
[project root] / work / org.apache.jsp / [jsp file name]_jsp.java

jspファイルへのリクエストへの度に_jspServiceメソッドを実行
javax.servlet.jsp.JspWriter型のout変数にjspファイルの内容を書き込む
結果として、整形されたHTMLコードがレスポンスで渡される。

JSP / ディレクティブ
  • page:ページ設定
  • taglib:タグライブラリ
  • include:外部ファイルの読み込み

JSP / pageディレクティブ
<%@ attribute1="value1" attribute2="value2" ... %>
import属性は複数使用可能で、その他は一度しか使用できない。
pageディレクティブの設定は、そのページのみで有効
  • language:javaを指定
  • contentType:MIMEタイプと文字エンコード("text/html; charset=UTF-8")
  • pageEncoding:JSPファイルをサーブレットクラスに変換するときの文字コード("UTF-8")
  • import:一度の指定でカンマ区切りで複数のクラスをインポート可能
    e.g. import="java.util.*, java.sql.*"
  • extends:JSPから変換する際のサーブレットクラスのスーパークラス
  • info:JSPページの情報。javax.servlet.ServletインターフェースのgetServletInfo()で取得することができる
  • session:セッション有効化フラグで、デフォルトはtrue(有効)です

スクリプティング要素
  • スクリプトレット:Javaプログラムブロック <% xxx; %>
  • 式:値を出力する式 <%= xxx %>
  • 宣言:変数宣言とメソッド定義のブロック <%! xxx %>
  • JSPコメント:HTMLコメントと違い、レスポンスで返されるHTMLには含まれない <%-- xxx --%>
式は文末に;がいらないけど、スクリプトレットと宣言は;が必要
式は変数やメソッドを1回呼び出すだけだからだろうか。

暗黙オブジェクト
オブジェクトを明示的に生成しなくても使用できるオブジェクト
  • out
  • request
  • response
  • session
  • application
  • config
  • pageContext
  • page
  • exception

JSP / 他のファイルの入れ込み
  • includeディレクティブ:<%@ include file="xxxx" %>
    include元と先どちらも合わせてコンパイルするので、元で先のJSPタグを使用できる
  • includeアクション:<jsp include page="xxxx" />
    include元を先にコンパイルし、その後にinclude先のファイルの呼び出す(実行する)

JSP / forwardアクションタグ
<jsp:forward page="xxx" />
前項includeディレクティブとアクションは、あくまで呼び出し元がHTTPレスポンスを返す。
一方、forwardアクションは、呼び出し先がHTTPレスポンスを返す。

2017年1月21日土曜日

Servlet / JSP 再入門とAWSやLinuxの雑記2

続き


メモ

Eclipseでブロックコメント追加のショートカットキー(Mac OSX)
Ctl + Cmd + /
解除ができないみたいですが。。。

Eclipseで現在の行のコピーのショートカットキー(Mac OSX)
Cmd + Alt + ↑ : 現在の行を1行下にコピーする(カーソルは移動しない)
Cmd + Alt + ↓ : 現在の行を1行下にコピーする(カーソルを移動する)

Servletのエンコーディング
javax.servlet.http.HttpServletRequest
: void setCharacterEncoding(String env)

javax.servlet.http.HttpServletResponse
: void setContentType(String type)

Javaのパッケージ名は小文字で、ドメインの逆、ハイフンは使えないのでアンスコ使う
広く → 狭く
参考:めちゃログ 「Java」パッケージ名の付け方! そして作成する方法
一方、プロジェクト名はどうすべきなのか。。。

http request headerのformdataのx, y
クリック位置だそうです。知らなかった。
参考:それマグで! <input type=image>で送信すると、X,Y座標が送信されるので、調べたら闇だった

Servlet / HTTPリクエストヘッダとレスポンスヘッダ
(interface)javax.servlet.http.HttpServletRequest
: String getHeader(string name)
: Enumeration getHeaderNames()

(interface)javax.servlet.http.HttpServletResponse
: void setHeader(string name, String value)
: void setStatus(int status_code)

Servletでリダイレクト
String referer = req.getHeader("Referer");  // リファラーの取得
if ( referer == null || referer.equals( URL_STRING) ) {
  resp.setStatus(303); // ステータスの設定
  resp.setHeader("Location",  url); // リダイレクト先
} 

Javaの正規表現
(class)java.util.regex.Pattern
: static Pattern compile(String regex)
: static Pattern compile(String regex, int flags)
: Matcher matcher(CharSequence input)
参考:JavaDrive 修飾子の種類と指定方法
DOTALLフラグを初めて知りました。デフォルトでは、.(ドット)は改行コードを含まないんですね。
(class)java.util.regex.Matcher
: boolean matches()
: boolean find()
: String group()

servletでファイルアップロード
Apache commonライブラリを使います
(Class)org.apache.commons.fileupload.disk.DiskFilteItemFactory
: void setSizeThreshold(int sizeThreshold) : void setRepository(File repository)

Servelet クッキーの利用
  1. クッキーオブジェクト作成
  2. クッキー発行
  3. クッキー取得
1.クッキーオブジェクト作成
(Class) javax.servlet.http.Cookie : Cookie(String name, String value)
: String getName()
: int getMaxAge()
: void setMaxAge(int expiry)
: String getValue()
: void setValue(string newValue)

2.クッキー発行
(interface)javax.servlet.http.HttpServletResponse
: void addCookie(Cookie cookie)

3.クッキー取得
(interface)javax.servlet.http.HttpServletRequest
: Cookie[] getCookie()

Servlet セッションオブジェクトによるセッショントラッキング
javax.servlet.http.HttpSession
: Object getAttribute(string name)
: void setAttribute(String name, Object value)
: invalidate()
: setMaxInactiveInterval(int interval) # デフォルトは30分

  1. セッションオブジェクト取得
  2. セッションオブジェクトから情報を取り出し記録
  3. セッションの破棄
1.セッションオブジェクト取得
(interface) javax.servlet.http.HttpServletRequest
: HttpSession getSession(boolean create)
: HttpSession getSession()

2.セッションオブジェクトから情報を取り出し記録
(interface) javax.servlet.http.HttpSession
: Object getAttribute(String name)
: void setAttribute(String name, Object value)

3.セッションの破棄
(interface) javax.servlet.http.HttpSession
: void invalidate()
: void setMaxInactiveInterval(int interval)

Servlet / JSP 再入門とAWSやLinuxの雑記

枯れた技術ですが必要があり復習。全然入門レベルから抜け出せてないですが。

前提:
デプロイ予定:amzn-ami-hvm-2016.09.1.20161221-x86_64-gp2(CentOS6ベース)
開発環境:
Mac OSX
Spring Tool Suite 3.8.3(Eclipse Neon.2(4.6.2)ベース)


メモ

AWSの初期設定
  • locale変更(/etc/sysconfig/i18n)
  • NICの設定(/etc/sysconfig/network)
  • 固定IPの場合(/etc/sysconfig/network)
  • 一般ユーザでsudoしたい場合
  • sshのパスワード認証を禁止する
参考:お便利サーバー.com サーバーを前提としたネットワーク設定

locale変更
$ vim /etc/sysconfig/i18n
LANG="ja_JP.utf8"
LC_CTYPE="ja_JP.utf8"
参考:
Qiita sshでログインした時、localeまわりでエラーが出た場合の対処法
CentOS(6.0)でロケール関係の設定

固定IPの場合
/etc/sysconfig/networkにホストのIPアドレスとサブネットマスクを記載する
IPADDR=xx.xx.xx.xx NETMASK=xx.xx.xx.xx

一般ユーザでsudoしたい場合
$ usermod -aG wheel <USER> ←G=補助グループの設定。a=追加(ないと置き換え)
# groups <USER> ← 確認
# visudo
# %wheel  ALL=(ALL)       ALL  ←コメント(#)を外す
参考:
Qiita Linuxでユーザーをグループに追加する Qiita Linuxコマンドでユーザーのグループ確認・変更。

sshのパスワード認証を禁止する
# vi /etc/ssh/sshd_config
PasswordAuthentication no
参考:sshでパスワード認証を禁止するには

/etc/sysconfig/network
centosのネットワーク設定ファイル
HOSTNAMEの変更時に設定を忘れないこと
参考:
CentOS6.0でホスト名を書き換える

ZeroConf
ITプロ Linuxキーワード Zeroconf
DNSやhostsファイルを使用せずに、ホスト名だけでホストを特定する仕組み。
ということで、通常サーバには不要
$ cat /etc/sysconfig/network
NOZEROCONF=yes

Java8の"JDK"を入れる
java-1.8.0-openjdk.x86_64はJREなんですね。ややこしい。
どこかのwebサイトに載っていたおかげで知りました。
まぁyum searchのパッケージの説明にも書いてはあるんですが。。。
java-1.8.0-openjdk.x86_64 : OpenJDK Runtime Environment
いち開発者としてはjavac入りのJDKを入れます。
$ yum update -y
$ yum install -y java-1.8.0-openjdk-devel.x86_64


システムJava(1.7)のままだったので、1.8にふりかえます。
$ alternatives --config java
2 プログラムがあり 'java' を提供します。

  選択       コマンド
-----------------------------------------------
*+ 1           /usr/lib/jvm/jre-1.7.0-openjdk.x86_64/bin/java
   2           /usr/lib/jvm/jre-1.8.0-openjdk.x86_64/bin/java

Enter を押して現在の選択 [+] を保持するか、選択番号を入力します:2


# java -version
openjdk version "1.8.0_111"
OpenJDK Runtime Environment (build 1.8.0_111-b15)
OpenJDK 64-Bit Server VM (build 25.111-b15, mixed mode)
# javac -version
javac 1.8.0_111
参考:Task Notes CentOSのalternativesでJavaのバージョン管理

tomcatの対応Javaバージョン表
公式Apache Tomcat Versions
まだalpha版だけどtomcat9も出ている。これはJava8が必要。
tomcat7/8.0/8.5はJava7で対応(tomcat7はWebSocket以外はJava6で問題なし)

service登録周り
/etc/rc.d/init.dに起動・停止スクリプトを置かないとサービス登録できません。
置いたら、
$ sudo chkconfig --add <service name>
$ sudo chkconfig <service name> on

SELinuxの確認
$ getenforce Disabled

IntelliJ CE(Community Editin)は Java EE非対応
大人の事情で、Eclipseを使うことにします。

Spring Tool SuiteにTomcatプラグインを入れる
今回はMarketplaceから入れました。Tomcat Manager Plugin 9.1.2

Mac OSXでEclipseを使うときは、¥ではなく\
¥だとEclipseがエスケープだと認識してくれない。。。

<html lang="ja">
「ダブルクォートいるっけ?」ググった。
改めて思うと、文字列をダブルクォートくくらないのは、Linuxのシェルくらいかな。

HTMLのテンプレート(Eclipse on Max OSX)
Preference → Web → HTML files → Templates → new HTML File(5) → Edit

cyberduckでAWS接続
FTPでなくSFTPでした。「pemどこに設定すんだろ」と思わず調べる
こちらのQiita記事(【AWS】cyberduckからファイルのアップロード、ダウンロードができない)に感謝です。

jarのデプロイ
参考:
迷走男子!! [Tomcat] Tomcatへのwebアプリのデプロイ方法(jarファイル編)
(tomcat_base)/webapps # tree hoge
hoge
`-- WEB-INF
    |-- lib
    |   `--(deploy jar file)
    `-- web.xml
というふうに、webappsにディレクトリ分けた上で、下記を配備
  • libディレクトリ
  • deploy jar file
  • web.xml

2016年12月17日土曜日

Java

コーディング力上げたいな。 もっというと、要件やテストケースの理解力が大事ですね。

Paizaさんのコンテンツで遊んでたけど、六村リオの緊急事態 (Bランク問題)のテストケース4で失敗する。。。悔しか。。。



/////////////////
// code
/////////////////
import java.util.*;

public class Main {
    public static void main(String[] args) {
        // 自分の得意な言語で
        // Let's チャレンジ!!
        Scanner sc = new Scanner(System.in);
        String line = sc.nextLine();
        String[] tempArray = line.split(" ", 0); 
        String[] currentDir = tempArray[0].split("/",0);
        ArrayList path = new ArrayList( Arrays.asList(currentDir) );
        String[] targetPath = tempArray[1].split("/",0);
        // System.out.println( Arrays.toString(currentDir) );
        // System.out.println( Arrays.toString(targetPath) );
        
        String output = "/";
        int position = path.size() - 1 ;
        // System.out.println(position);
        for ( String dir : targetPath ) {
            if ( dir.equals("..") ) {
                position =  ( position == 0 ) ? position : --position;
                
            } else if ( dir.equals(".") ) {
                continue;    
            } else if (  ! path.get( position ).equals(dir)  ) {
                path.add( position + 1  ,dir);
                position++;
            }
        }
        
        for ( int i = 1; i < position + 1  ; i++ ) {
            output += path.get(i) ;
            if ( i < position  ) {
                output += "/";
            }
        }
        System.out.println(output);
    }
}

2016年10月26日水曜日

<Java>EJBだとアクセス修飾子でコンパイルエラーにならない?

最近、プログラミングで困ったことをアップしておきます。

Stateless EJBから、同パッケージの別クラスのメソッドへのアクセス不可でもコンパイルエラーにはならなず、実行時エラーになる。

説明が難しいですね。。。
まず、アクセス修飾子についておさらいですが、
protectedが付与されたメンバには、自クラス・同パッケージ・サブクラスからアクセスできます。

Oracle The Java™ Tutorials Controlling Access to Members of a Class

antのビルドは通ったのですが、 実行時、stateless EJB bean からアクセスする際に下記のエラーが出ました。

java.lang.IllegalAccessError: tried to access method Connected.getString(Ljava/lang/String;)Ljava/sql/ResultSet; from class sample

先輩に教わりましたが、publicにすると問題なく実行できました。
protectedだから問題ないと思ってましたが、実行時のエラーから問題のあるメソッドは特定できていたので、試してみるべきでした。。。
同パッケージなのに、protectedでアクセスできないというのは、クラスローダーが違うからみたいです。 java EEのデバッグしんどい。。。

参照: stack overflow / java.lang.IllegalAccessError: tried to access method

2016年10月22日土曜日

<Java>ResultSetからのデータ抽出は、カラム番号ではなくカラム名で!

Javaの小ネタ。実装時にどのメソッドを使うべきか、という低レベルな話です。

ResultSetからのデータ抽出

JavaでデータベースにSQLのSELECT文を流す際、PreparedStatementとResultSetを使います。
ResultSetから値を取り出す際は、引数はカラム番号ではなくカラム名にしましょう。

例えば、ResultSetには、文字列を取り出すメソッドが2つ用意されています。
正確には、オーバーライドされて、カラム番号(int)とカラム名(String)のどちらも引数に取れるということです。

  • String getString(int columnIndex)
  • String getString(String columnLabel)

columnIndex(カラム番号)は、1始まりなので、配列のインデックスと間違えて、ゼロ始まりとしてしまう可能性があります。
また、columnLabel(カラム名)としておけば、可読性も増します。
まとめとして、ResultSetから値を取り出す際は、引数はカラム名を使いましょう。

<Java>コンストラクタの継承はない

Javaの入門書を読み直して、「あー、そうだったね。」という点を書いてみます。

  • メソッドのシグネチャは下記3つ
    1. 戻り値の型
    2. メソッド名
    3. 引数の型
  • 親クラスが持つ、引数の数が違うコンストラクタは、子クラスでは呼び出せない
    ※ メソッドとは違って、引き継がれない(透けて見えることがない) ※ superで呼び出すことはできます。
    ※ (追記)まぁ、コンストラクタ名が違うので当たり前ですよね。。。
  • 親クラスで引数を持つコンストラクタが定義された場合、子クラスで呼び出さないとコンパイルエラーとなる
    ※ 正確にいうと、親クラスに対応するコンストラクタがないと、子クラスのインスタンス生成時にコンパイルエラーになるよって話

継承は、メソッドだけでなく、コンストラクタにも縛りがあり、親子間の共通化が徹底されている(保証されている)ことを再認識しました。

2016年9月25日日曜日

<Java>変数のデフォルト値

クラス変数 => 初期化しないと参照先がない
     ※この状態で変数を呼び出すと、コンパイルエラーとなります。

メンバ変数 => インスタンス化した時点で、デフォルト値が入る
     boolean型以外の基本型 = ゼロ
     boolean = false
     オブジェクト参照型 = null

インスタンスかどうかで変わるのが、紛らわしいところです。

java.lang.ArrayIndexOutOfBoundsException

Javaの基本的なエラーの一つ
配列のインデックスが、配列の範囲外であった時に発生する例外です。
面白いことに、java.langパッケージなんですね。

エラーメッセージとして、不正なインデックス値が明示されます。
下記は、コード例です。


 8: public static void main(String[] args) {
 9:  int a = Integer.parseInt(args[0]);
10:  int b = Integer.parseInt(args[-1]);
11:  int c = a + b;
12:  System.out.println(c);
13: }

エラーメッセージは下記の通りです。


Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: -1
 at example.Example1.main(Example1.java:10)

Eclipseでのコンパイルエラーの表示箇所

EclipseでJavaをコーディングする上での基本ですが、コンパイルエラーの詳細は下記のように表示されます。

どのアプリケーションの、
  どのクラスで、
    どのスレッドで、どんなエラーが
      どのメソッドで発生したか、
を示す構造です。

上記の例ですと、intがた変数にdouble型の値を代入しようとしたことを示します。
下記がコードです。


public class Example1 {

 /**
  * @param args
  */
 public static void main(String[] args) {
  double d = 12.3;
  
  int i = d;
  System.out.println(d);
  System.out.println(i);
 }

}

MacOS上のEclipseで"MacRoman文字エンコードを使用してマップすることはできません"

StackOverFlow、お世話になっています。

MacOSで日本語入力したところ、下記のエラーが出ました。

保管を完了できませんでした。 理由: 一部の文字は"MacRoman"文字エンコードを使用してマップすることはできません。 エンコードを変更するか、"MacRoman"文字エンコードによってサポートされていない文字を除去してください。

下記の設定で問題なく実行できました。
Preference => General => Workspace
- Text file encoding = Other(UTF-8)
- New text file line delimiter = Other(Unix)

6年の前の記事 ですが、助かりました。