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

Volley synchronous request / Volleyで同期的なリクエストをする方法

com.android.volley.toolbox.RequestFuture

RequestQueue queue = Volley.newRequestQueue(context);
RequestFuture<Hoge> future = RequestFuture.newFuture();
Request<Hoge> request = new FugaRequest(Request.Method.POST, url, future);
queue.add(request);
try {
    Hoge response = future.get();
} catch (InterruptedException e) {
    // TODO
} catch (ExecutionException e) {
    // TODO
}

Intent com.android.camera.action.CROP ActivityNotFoundException

Intent intent = new Intent("com.android.camera.action.CROP");

    /* Not work. ActivityNotFoundException occurs. */
    //intent.setType("image/*");
    //intent.setData(uri);

    intent.setDataAndType(uri, "image/*"); // works!

    startActivityForResult(intent, REQUEST_CODE_IMAGE_CROP);
(マジ?)

Apache HBase "Could not reserve enough space for heap offset array"

  1. Run "./bin/hbase shell",
    $ ./bin/hbase shell
    Error: Could not create the Java Virtual Machine.
    Error: A fatal exception has occurred. Program will exit.
    Error occurred during initialization of VM
    Could not reserve enough space for heap offset array
    
  2. "Could not reserve enough space for heap"?
  3. Edit "./conf/hbase-env.sh",
    $ vi conf/hbase-env.sh
    export _JAVA_OPTIONS='-Xmx256m -Xms64m'
    
    # Extra Java CLASSPATH elements.  Optional.
    # export HBASE_CLASSPATH=
    
    # The maximum amount of heap to use, in MB. Default is 1000.
    export HBASE_HEAPSIZE=128
    

NullPointerException

Effective Java 第2版 第2章オブジェクトの生成と消滅 項目6廃れたオブジェクト参照を取り除く」に、廃れた参照に null を設定する必要があるプログラムで、廃れた参照に null を設定することで得られる派生的な利点に、
参照が間違って使用された場合に、プログラムは何も言わずに間違った処理を行うのではなく、 NullPointerException ですぐにエラーとなることです。プログラミングのエラーをできるだけ早い段階で発見することは常に有益です。
とあります。

たしかに。
好き嫌いや時と場合にもよりますが、個人的には落ちてくれたほうが良いです。


see also: Javaプログラマであるかを見分ける10の質問 7.NullPointerExceptionが発生するのは主にどういう状況か?

android org.apache.http.client.HttpClient user-agent

  • Android 2.2 (API Level 8)
  • リクエスト
    final HttpClient client = new DefaultHttpClient();
    final HttpParams params = client.getParams();
    params.setParameter(CoreProtocolPNames.USER_AGENT, "android user-agent hoge"); // !
    final HttpGet request = new HttpGet("http://hogehoge.com/");
    try {
    	final HttpResponse response = client.execute(request);
    	// ・・・
    } catch (ClientProtocolException e) {
    	// TODO Auto-generated catch block
    } catch (IOException e) {
    	// TODO Auto-generated catch block
    }
    
    サーバ側ログ
    192.168.100.101 - - [01/Aug/2011:01:23:45 +0900] "GET / HTTP/1.1" 200 175 "-" "android user-agent hoge"
    

アクセサ( getter / setter)・不変クラス( immutable )・カプセル化( encapsulation )

public interface Radioactivity {
 /**
  * 年間放射線量を取得する。
  * @return ミリシーベルト
  */
 double getRadiation();
 /**
  * 設定されている線量が安全かどうか
  * @return true の場合、安全
  */
 boolean isSafe();
}
/**
 * 平常時
 */
public class Normal implements Radioactivity {
 private double radiation;
 public Normal(double radiation) {
  this.radiation = radiation;
 }
 /**
  * @see Radioactivity#getRadiation()
  */
 public double getRadiation() {
  return this.radiation;
 }
 /**
  * @see Radioactivity#isSafe()
  */
 public boolean isSafe() {
  return this.radiation < 1.0d;// ふつうはこのぐらい
 }
}
/**
 * 緊急時
 */
public class Emergency implements Radioactivity {
 private double radiation;
 public Emergency(double radiation) {
  this.radiation = radiation;
 }
 /**
  * @see Radioactivity#getRadiation()
  */
 public double getRadiation() {
  return this.radiation;
 }
 /**
  * @see Radioactivity#isSafe()
  */
 public boolean isSafe() {
  return this.radiation < 20.0d;// 緊急なので致し方なく
 }
}
  • アクセサを getter のみにすることで一度設定した年間の被曝線量を変更できなくする(不変クラス)( immutable )
  • #isSafe() メソッドは時の政府の都合により内部の処理を変更することができる(カプセル化)( encapsulation )
see also: Javaプログラマであるかを見分ける10の質問 5.フィールドのアクセス修飾子をprivateにしgetter/setterメソッドを提供する事でフィールドを参照する設計方針を取る主な理由を説明せよ

チェック例外( checked exception )と非チェック例外( unchecked exception )

Java の例外
  • コンストラクタやメソッドが実行された時に、戻り値とは別の例外的な値を呼び出し元に戻したい時に、Throwable クラスのサブクラスを生成して呼び出し元に戻すことが出来る
  • コンストラクタやメソッドを実行した結果、本来の正常な処理とは別の例外的な値がコンストラクタやメソッドから返ってきた場合に、メソッドの呼び出し元は catch 節で正常処理とは別のエラー処理のコードを書くことが出来る
チェック例外
  • 投げる側はコンストラクタやメソッドに throws 宣言しなければならない
  • 呼び出し元は try-catch ブロックで囲むか、自分のメソッドシグニチャーで throws 宣言しなければならない
非チェック例外
  • Error クラスまたは RuntimeExceptoin クラス、もしくはそのサブクラス
  • 投げる側はコンストラクタやメソッドに throws 宣言しなくても良い(
  • 呼び出し元も try-catch で囲む必要もないし、自分のメソッドシグニチャーで throws 宣言する必要もない(
see also: Javaプログラマであるかを見分ける10の質問 5.チェック例外と非チェック例外の違いを型と例外処理の観点で説明せよ。

GC(ガーベジコレクション)

オブジェクトに最初に割り当てられたメモリ空間を、そのオブジェクトが使われなくなった時(そのオブジェクトへの参照がなくなった時)に、JavaVM がそのオブジェクトが占有していたメモリ空間を自動的に解放する。



GCされない例/される例

GCされない例
class Dept { // 部署クラス
    private Emp[] emps; // 所属する従業員
    private int size;
    public Dept() {
        emps = new Emp[10]; // 従業員の席を用意
    }
    public void employ(Emp emp) { // 従業員を雇う
        if(emps.length == size) {
            emps = Arrays.copyOf(emps, 2 * size + 1); // 定員オーバーになったら、席を追加
        }
        emps[size++] = emp;
    }
    public void fire(int index) { // 従業員を解雇する
        Emp emp = emps[index];
        emp.empNo = -1;
    }
    public int getEmpsSize() {
        return size;
    }
}




OutOfMemoryErrorを発生させる
public static final void main(String[] args) {
        Dept[] depts = new Dept[3456]; // 3456個部署作って・・・
        int deptNo = 0;
        int empNo = 0;
        try {
            while(deptNo < depts.length) {
                Dept dept = new Dept();
                depts[deptNo++] = dept;
                for(int i = 0; i < 3456; i++) { // 3456人部署に雇って・・・
                    Emp emp = new Emp(deptNo, empNo++);
                    dept.employ(emp);
                }
                int empsSize = dept.getEmpsSize();
                for(int i = 0; i < empsSize; i++) {
                    if((i % 2) == 0) { // 内、半分を解雇する
                        dept.fire(i);
                    }
                }
            }
        } catch(OutOfMemoryError e) {
            System.err.println("OutOfMemoryError");
        } finally {
            System.out.println("deptNo : " + deptNo + " empNo : " + empNo); // deptNo : 3332 empNo : 11514569
        }
    }
自分の環境だと、 3332個目の部署・11514569人目の従業員でOutOfMemoryErrorが発生する。
GCされる例
部署クラスのfire()メソッド内で、解雇された従業員にnullを設定するように変更する。
public void fire(int index) {
        emps[index] = null; // nullを設定する
        size--;
    }
もう一度mainを実行すると、 「deptNo : 3456 empNo : 11943936」が出力されて、OutOfMemoryErrorはスローされずにプログラムが終了する。 そもそもこの部署クラスのように、プログラマーが独自にメモリー管理をしなれけばならないようなプログラムは、例外的であるべきだ、とEffective Javaには書いてあります。 see also: Javaプログラマであるかを見分ける10の質問 4.オブジェクトがガベージコレクション(GC)される主たる条件は何か?
see also: Effective Java(第2版)第2章オブジェクトの生成と消滅 項目6 廃れたオブジェクトの参照を取り除く

Generics(ジェネリクス(総称))・Type Safe(タイプセーフ(型の安全性))

1.5以降

interface EmpService {
    List<Emp> getEmps(int deptNo);
}
List<Emp> emps = empService.getEmps(10);
for(int i = 0; i < emps.size(); i++) {
    Emp emp = emps.get(i); // キャストの必要なし・コード量減る
    // 処理
}
for(Emp emp : emps) { // 拡張forループ使えばもっとコード量減る
    // 処理
}

1.4以前

interface EmpService {
    List getEmps(int deptNo);
}
List emps = empService.getEmps(10);
for(int i = 0; i < emps.size(); i++) {
    Emp emp = (Emp) emps.get(i); // キャストが必要・ClassCastExceptionになるかどうかは実行時までわからない
    // 処理
}
Object obj = emps.get(i);
if(obj instanceof Emp) { // なのでこんな感じでチェックする必要があり・ロジック増える
    Emp emp = (Emp) obj;
    // 処理
}
see also: Javaプログラマであるかを見分ける10の質問 3.List<Integer>のようにジェネリクス型を使う主たる目的は何か

文字列連結、java.lang.StringBuilder、java.lang.StringBuffer

public static final void main(String[] args) {
        int i = 0;
        String str = String.valueOf(i);
        long start = System.currentTimeMillis();
        while(i < 100000) {
            str = str + "/" + (i++);
        }
        long end = System.currentTimeMillis();
        System.out.println("[+]=" + (end - start));// #1=114719, #2=108078, #3=114188
    }
public static final void main(String[] args) {
        int i = 0;
        StringBuilder builder = new StringBuilder(i);
        long start = System.currentTimeMillis();
        while(i < 100000) {
            builder.append("/").append(i++);
        }
        long end = System.currentTimeMillis();
        System.out.println("[StringBuilder]=" + (end - start));// #1=15, #2=15, #3=16
    }
public static final void main(String[] args) {
        int i = 0;
        StringBuffer buffer = new StringBuffer(i);
        long start = System.currentTimeMillis();
        while(i < 100000) {
            buffer.append("/").append(i++);
        }
        long end = System.currentTimeMillis();
        System.out.println("[StringBuffer]=" + (end - start));// #1=16, #2=47, #3=15
    }
see also: Javaプログラマであるかを見分ける10の質問 「文字列の+演算子による連結とStringBuilderを使った連結の違いを説明せよ。」

==演算子とjava.lang.Object#equals(Object)メソッド

public class Equals {
    public static final void main(String[] args) {
        final String aaa0 = "aaa";
        final String aaa1 = "aaa";
        System.out.println("aaa0 == aaa1 : " + (aaa0 == aaa1));// -> true
        final String aaa2 = new String("aaa");
        final String aaa3 = new String("aaa");
        System.out.println("aaa2 == aaa3 : " + (aaa2 == aaa3));// -> false
        System.out.println("aaa2 equals aaa3 : " + (aaa2.equals(aaa3)));// -> true
        
        final Integer one0 = 1;
        final Integer one1 = 1;
        System.out.println("one0 == one1 : " + (one0 == one1));// -> true
        final Integer one2 = new Integer(1);
        final Integer one3 = new Integer(1);
        System.out.println("one2 == one3 : " + (one2 == one3));// -> false
        System.out.println("one2 equals one3 : " + (one2.equals(one3)));// -> true
        
        final Hoge hoge0 = new Hoge(0);
        final Hoge hoge1 = new Hoge(0);
        System.out.println("hoge0 == hoge1 : " + (hoge0 == hoge1));// -> false
        System.out.println("hoge0 equals hoge1 : " + (hoge0.equals(hoge1)));// -> true
    }
}
class Hoge {
    private int i;
    public Hoge(int i) {
        this.i = i;
    }
    public int getI() {
        return i;
    }
    @Override public boolean equals(Object obj) {
        return obj instanceof Hoge ? ((Hoge) obj).getI() == i : false;
    }
    @Override public int hashCode() {
        return i;
    }
}
see also: Javaプログラマであるかを見分ける10の質問 「==演算子とequalsメソッドの違いは何か?」