SlideShare una empresa de Scribd logo
1 de 39
Descargar para leer sin conexión
(@v vakame)


                Android




2011   8   25
•

                •

                •




                    http://www.slideshare.net/vvakame/debugging-strategy


2011   8   25
2011   8   25
2011   8   25
…




2011   8   25
•

                    • initA()      initB()        init()
                                    A, B public
                •              2

                    •      (          )
                    •
                •                         …
2011   8   25
/**
    *           bitmap                 .
     *
     * @param bitmapArrays
     */
   static void dot1PixelA(Bitmap[][] bitmapArrays) {
   	    for (int i = 0; i < bitmapArrays.length; i++) {          for
   	    	   for (int j = 0; j < bitmapArrays[i].length; i++) {
   	    	   	   bitmapArrays[j][i].setPixel(0, 0, Color.RED);
   	    	   }
   	    }
   }

   /**
    *           bitmap                 .
     *
     * @param bitmapArrays
     */
   static void dot1PixelB(Bitmap[][] bitmapArrays) {
   	
   	
        for (Bitmap[] bitmapArray : bitmapArrays) {
        	   for (Bitmap bitmap : bitmapArray) {
                                                                 for-each
   	    	   	   bitmap.setPixel(0, 0, Color.RED);
   	    	   }
   	    }
   }

2011   8   25
/**
    *           bitmap                 .
     *
     * @param bitmapArrays
     */
   static void dot1PixelA(Bitmap[][] bitmapArrays) {
   	    for (int i = 0; i < bitmapArrays.length; i++) {          for
   	    	   for (int j = 0; j < bitmapArrays[i].length; i++) {
   	    	   	   bitmapArrays[j][i].setPixel(0, 0, Color.RED);
   	    	   }
   	    }
   }

   /**
    *           bitmap                 .
     *
     * @param bitmapArrays
     */
   static void dot1PixelB(Bitmap[][] bitmapArrays) {
   	
   	
        for (Bitmap[] bitmapArray : bitmapArrays) {
        	   for (Bitmap bitmap : bitmapArray) {
                                                                 for-each
   	    	   	   bitmap.setPixel(0, 0, Color.RED);
   	    	   }
   	    }
   }

2011   8   25
Bitmap[][] bitmapArrays = new Bitmap[10][10];
 for (int i = 0; i < bitmapArrays.length; i++) {
 	 for (int j = 0; j < bitmapArrays[i].length; j++) {
 	 	 bitmapArrays[i][j] = Bitmap.createBitmap(3, 3, Config.ARGB_8888);
 	 }
 }



                                                            …




2011   8   25
ADT


                      2011/08/25   rev12

2011   8   25
2011   8   25
•

                    •

                    •

                    • null




2011   8   25
• LogCat




2011   8   25
•

 L07	 @Override
 L08	 public void onCreate(Bundle savedInstanceState) {
 L09	 	   super.onCreate(savedInstanceState);
 L10	 	   setContentView(R.layout.main);
 L11
 L12	 	   try {
 L13	 	   	   throw new NullPointerException();
 L14	 	   } catch (Exception e1) {
 L15	 	   	   try {
 L16	 	   	   	    throw new IllegalArgumentException(e1);
 L17	 	   	   } catch (Exception e2) {
 L18	 	   	   	    try {
 L19	 	   	   	    	   throw new IllegalStateException(e2);
 L20	 	   	   	    } catch (Exception e3) {
 L21	 	   	   	    	   throw new RuntimeException(e3);
 L22	 	   	   	    }
 L23	 	   	   }
 L24	 	   }
 L25	 }




                                                              Caused
2011   8   25
•
       L08	 @Override
       L09	 public void onCreate(Bundle savedInstanceState) {
       L10	 	   super.onCreate(savedInstanceState);
       L11	 	   setContentView(R.layout.main);
       L12	 	   requestWindowFeature(Window.FEATURE_NO_TITLE);
       L13	 }




                                                                 L11 L12


2011    8   25
L22       …
       L09	 @Override
       L10	 public void onCreate(Bundle savedInstanceState) {
       L11	 	   super.onCreate(savedInstanceState);
       L12
       L13	 	   LinearLayout layout1 = new LinearLayout(this);
       L14	 	   LinearLayout layout2 = new LinearLayout(this);
       L15	 	   LinearLayout layout3 = new LinearLayout(this);
       L16	 	   Button button = new Button(this);
       L17
       L18	 	   layout1.addView(layout2);
       L19	 	
       L20	 	
                layout2.addView(layout1);
                layout3.addView(button);
                                            layout1 → layout2 → layout1
       L21
       L22	 	   setContentView(layout1);              layout1 → layout2 → layout3       …
       L23	 }




2011   8   25
“      ”
                •              (     ω   ´)

                    •

                    •

                    •                    ←

                    • ……                      ……

                    •              … orz ←
2011   8   25
“       ”
                •

                •

                •

                    •
                            …

                    •

2011   8   25
void sort() {
                       	   List<String> list = new ArrayList<String>();
                       	   list.add("cupcake");
                       	   list.add(null);
                       	   list.add("donuts");
                       	   list.add(null);
                       	   list.add("froyo");

                       	   Collections.sort(list, new Comparator<String>() {
                       	   	   @Override
                       	   	   public int compare(String str1, String str2) {
                       	   	   	   if (str1 == null) {
                       	   	   	   	    return -1;
                       	   	   	   }
                       	   	   	   return str1.compareTo(str2);
                       	   	   }
                       	   });

                       	   Log.d("Debug", list.toString());
                       }



                    NullPointerException                                        …
           LogCat                                                                   …
2011   8   25
2011   8   25
str2   null
            String#compareTo(String)   null   …

2011   8   25
NPE(NullPointerException)


2011   8   25
2011   8   25
…
                public class Util {

                	   /**
                	    *       2          1                            .
                	    * @param list1 1
                	    * @param list2 2
                	    * @return 1
                	     */
                	   public static List<Object> merge(List<Object> list1, List<Object> list2) {
                	   	    list1.addAll(list2);
                	   	    return list1;
                	   }

                	   /**
                	    *                   1                            .
                	    * @param lists
                	    * @return 1
                	     */
                	   public static List<Object> merge(List<?>... lists) {
                	   	    List<Object> result = new ArrayList<Object>();
                	   	    for (List<?> list : lists) {
                	   	    	   result.addAll(list);
                	   	    }
                	   	    return result;
                	   }
                }


2011   8   25
public void test() {
                	   List<Object> list1 = new ArrayList<Object>();
                	   list1.add("a");
                	   list1.add("b");
                	   List<Object> list2 = new ArrayList<Object>();
                	   list2.add(1);
                	   list2.add(2);
                	   List<Object> list3 = new ArrayList<Object>();
                	   list3.add(1.25);
                	   list3.add(2.5);

                	   List<Object> merged1 = Util.merge(list1, list2);
                	   List<Object> merged2 = Util.merge(list1, list2, list3);

                	   assertEquals(merged1.size(),   4);
                	   assertEquals(merged1.get(0),   "a");
                	   assertEquals(merged1.get(1),   "b");
                	   assertEquals(merged1.get(2),   1);
                	   assertEquals(merged1.get(3),   2);

                	   assertEquals(merged2.size(),   6);
                	   assertEquals(merged2.get(0),   "a");
                	   assertEquals(merged2.get(1),   "b");
                	   assertEquals(merged2.get(2),   1);
                	   assertEquals(merged2.get(3),   2);
                	   assertEquals(merged2.get(4),   1.25);
                	   assertEquals(merged2.get(5),   2.5);
                }


2011   8   25
public void test() {
       	   List<Object> list1 = new ArrayList<Object>();
       	   list1.add("a");
       	   list1.add("b");
       	   List<Object> list2 = new ArrayList<Object>();
       	   list2.add(1);
       	   list2.add(2);
       	   List<Object> list3 = new ArrayList<Object>();
       	   list3.add(1.25);
       	   list3.add(2.5);

       	    List<Object> merged1 = Util.merge(list1, list2);
       	    List<Object> merged2 = Util.merge(list1, list2, list3);

       	    assertEquals(merged1.size(),   4);
       	    assertEquals(merged1.get(0),   "a");
       	    assertEquals(merged1.get(1),   "b");
       	    assertEquals(merged1.get(2),   1);
       	    assertEquals(merged1.get(3),   2);



                                                                      size   8
       	    assertEquals(merged2.size(),   6);
       	    assertEquals(merged2.get(0),   "a");
       	    assertEquals(merged2.get(1),   "b");
       	    assertEquals(merged2.get(2),   1);
       	    assertEquals(merged2.get(3),   2);
       	    assertEquals(merged2.get(4),   1.25);
       	    assertEquals(merged2.get(5),   2.5);
       }


2011   8   25
Debug As ...




2011   8   25
• F8

                • F5 1   (   )

                • F6 1   (       )

                • F7




2011   8   25
8   …


2011   8   25
(   )
2011   8   25
•
                    •               ,   ,
                    •   Variables
                •
                    •
2011   8   25
…
                ¨   ¨   ¨   ¨   ¨   ¨   ¨   ¨...
2011   8   25
→Inspect




2011   8   25
2011   8   25
•

                •

                •

                •

                •

                •
2011   8   25
2011   8   25
OpenGL




2011   8   25
OpenGL




  http://t.co/bet4051

2011   8   25
2011   8   25

Más contenido relacionado

La actualidad más candente

An introduction to functional programming with Go [redux]
An introduction to functional programming with Go [redux]An introduction to functional programming with Go [redux]
An introduction to functional programming with Go [redux]Eleanor McHugh
 
python-geohex
python-geohexpython-geohex
python-geohexRyo Aita
 
Boost.勉強会#4 Boost.Proto
Boost.勉強会#4 Boost.ProtoBoost.勉強会#4 Boost.Proto
Boost.勉強会#4 Boost.Protofjnl
 
Programación funcional en Haskell
Programación funcional en HaskellProgramación funcional en Haskell
Programación funcional en HaskellRoberto Bonvallet
 
EJEMPLOS DESARROLLADOS
EJEMPLOS DESARROLLADOSEJEMPLOS DESARROLLADOS
EJEMPLOS DESARROLLADOSDarwin Durand
 
Spring Framework Orm Di
Spring Framework Orm DiSpring Framework Orm Di
Spring Framework Orm Diahwkong2000
 
Most Common JavaScript Mistakes
Most Common JavaScript MistakesMost Common JavaScript Mistakes
Most Common JavaScript MistakesYoann Gotthilf
 
FP is coming... le 19/05/2016
FP is coming... le 19/05/2016FP is coming... le 19/05/2016
FP is coming... le 19/05/2016Loïc Knuchel
 

La actualidad más candente (14)

An introduction to functional programming with Go [redux]
An introduction to functional programming with Go [redux]An introduction to functional programming with Go [redux]
An introduction to functional programming with Go [redux]
 
python-geohex
python-geohexpython-geohex
python-geohex
 
20150415 csharp6.0
20150415 csharp6.020150415 csharp6.0
20150415 csharp6.0
 
Boost.勉強会#4 Boost.Proto
Boost.勉強会#4 Boost.ProtoBoost.勉強会#4 Boost.Proto
Boost.勉強会#4 Boost.Proto
 
Reactive x
Reactive xReactive x
Reactive x
 
All set1
All set1All set1
All set1
 
Java
Java Java
Java
 
Programación funcional en Haskell
Programación funcional en HaskellProgramación funcional en Haskell
Programación funcional en Haskell
 
EJEMPLOS DESARROLLADOS
EJEMPLOS DESARROLLADOSEJEMPLOS DESARROLLADOS
EJEMPLOS DESARROLLADOS
 
Tugas pw [10]
Tugas pw [10]Tugas pw [10]
Tugas pw [10]
 
Tugas pw [10]
Tugas pw [10]Tugas pw [10]
Tugas pw [10]
 
Spring Framework Orm Di
Spring Framework Orm DiSpring Framework Orm Di
Spring Framework Orm Di
 
Most Common JavaScript Mistakes
Most Common JavaScript MistakesMost Common JavaScript Mistakes
Most Common JavaScript Mistakes
 
FP is coming... le 19/05/2016
FP is coming... le 19/05/2016FP is coming... le 19/05/2016
FP is coming... le 19/05/2016
 

Destacado

Le rapport gallois 2012
Le rapport gallois 2012Le rapport gallois 2012
Le rapport gallois 2012ARXOM
 
CEATEC Glassware(Google Glassアプリ)開発の指南と開発事例
CEATEC Glassware(Google Glassアプリ)開発の指南と開発事例CEATEC Glassware(Google Glassアプリ)開発の指南と開発事例
CEATEC Glassware(Google Glassアプリ)開発の指南と開発事例Masahiro Wakame
 
俺とお前とGoogleware
俺とお前とGoogleware俺とお前とGoogleware
俺とお前とGooglewareMasahiro Wakame
 

Destacado (8)

Le rapport gallois 2012
Le rapport gallois 2012Le rapport gallois 2012
Le rapport gallois 2012
 
CEATEC Glassware(Google Glassアプリ)開発の指南と開発事例
CEATEC Glassware(Google Glassアプリ)開発の指南と開発事例CEATEC Glassware(Google Glassアプリ)開発の指南と開発事例
CEATEC Glassware(Google Glassアプリ)開発の指南と開発事例
 
俺とお前とGoogleware
俺とお前とGoogleware俺とお前とGoogleware
俺とお前とGoogleware
 
Memes
MemesMemes
Memes
 
JavaScript再入門
JavaScript再入門JavaScript再入門
JavaScript再入門
 
JavaScript 再入門2
JavaScript 再入門2JavaScript 再入門2
JavaScript 再入門2
 
TypeScript 独習会
TypeScript 独習会TypeScript 独習会
TypeScript 独習会
 
TypeScript Hands-on
TypeScript Hands-onTypeScript Hands-on
TypeScript Hands-on
 

Más de Masahiro Wakame

GoCon2016 spring 自作Webフレームワーク uconを作った話
GoCon2016 spring 自作Webフレームワーク uconを作った話GoCon2016 spring 自作Webフレームワーク uconを作った話
GoCon2016 spring 自作Webフレームワーク uconを作った話Masahiro Wakame
 
GoCon 2015 Summer GoのASTをいじくって新しいツールを作る
GoCon 2015 Summer GoのASTをいじくって新しいツールを作るGoCon 2015 Summer GoのASTをいじくって新しいツールを作る
GoCon 2015 Summer GoのASTをいじくって新しいツールを作るMasahiro Wakame
 
ng-japan 2015 TypeScript+AngularJS 1.3
ng-japan 2015 TypeScript+AngularJS 1.3ng-japan 2015 TypeScript+AngularJS 1.3
ng-japan 2015 TypeScript+AngularJS 1.3Masahiro Wakame
 
TypeScriptは明日から使うべき
TypeScriptは明日から使うべきTypeScriptは明日から使うべき
TypeScriptは明日から使うべきMasahiro Wakame
 
TypeScript 型定義ファイルのある開発 TypeScript勉強会 VSハッカソン倶楽部
TypeScript 型定義ファイルのある開発 TypeScript勉強会 VSハッカソン倶楽部TypeScript 型定義ファイルのある開発 TypeScript勉強会 VSハッカソン倶楽部
TypeScript 型定義ファイルのある開発 TypeScript勉強会 VSハッカソン倶楽部Masahiro Wakame
 
Google Glassでできること XE12版 最新開発情報 Mirror API & GDK
Google Glassでできること XE12版 最新開発情報 Mirror API & GDKGoogle Glassでできること XE12版 最新開発情報 Mirror API & GDK
Google Glassでできること XE12版 最新開発情報 Mirror API & GDKMasahiro Wakame
 
コンパイラ指向ReVIEW
コンパイラ指向ReVIEWコンパイラ指向ReVIEW
コンパイラ指向ReVIEWMasahiro Wakame
 
20ヶ月を取り戻す Dart flight school
20ヶ月を取り戻す Dart flight school20ヶ月を取り戻す Dart flight school
20ヶ月を取り戻す Dart flight schoolMasahiro Wakame
 
Google Glassでできること XE11版 最新開発情報 Mirror API & GDK
Google Glassでできること XE11版 最新開発情報 Mirror API & GDKGoogle Glassでできること XE11版 最新開発情報 Mirror API & GDK
Google Glassでできること XE11版 最新開発情報 Mirror API & GDKMasahiro Wakame
 
ReVIEW & CI - ChefでCI環境構築
ReVIEW & CI - ChefでCI環境構築ReVIEW & CI - ChefでCI環境構築
ReVIEW & CI - ChefでCI環境構築Masahiro Wakame
 
Firefox OS勉強会 2nd TypeScript+AngularJS
Firefox OS勉強会 2nd TypeScript+AngularJSFirefox OS勉強会 2nd TypeScript+AngularJS
Firefox OS勉強会 2nd TypeScript+AngularJSMasahiro Wakame
 
AngularJS+TypeScript - AngularJS 1周年記念勉強会
AngularJS+TypeScript - AngularJS 1周年記念勉強会AngularJS+TypeScript - AngularJS 1周年記念勉強会
AngularJS+TypeScript - AngularJS 1周年記念勉強会Masahiro Wakame
 
Buildinsider OFFLINE TypeScriptの基礎から実践・利用事例まで
Buildinsider OFFLINE TypeScriptの基礎から実践・利用事例までBuildinsider OFFLINE TypeScriptの基礎から実践・利用事例まで
Buildinsider OFFLINE TypeScriptの基礎から実践・利用事例までMasahiro Wakame
 
Datastoreへのアクセスを楽してMemcacheアクセスに置き換えるライブラリ作った
Datastoreへのアクセスを楽してMemcacheアクセスに置き換えるライブラリ作ったDatastoreへのアクセスを楽してMemcacheアクセスに置き換えるライブラリ作った
Datastoreへのアクセスを楽してMemcacheアクセスに置き換えるライブラリ作ったMasahiro Wakame
 
函館IKA Eclipse活用術
函館IKA Eclipse活用術函館IKA Eclipse活用術
函館IKA Eclipse活用術Masahiro Wakame
 
函館IKA ICS開発情報
函館IKA ICS開発情報函館IKA ICS開発情報
函館IKA ICS開発情報Masahiro Wakame
 

Más de Masahiro Wakame (20)

GoCon2016 spring 自作Webフレームワーク uconを作った話
GoCon2016 spring 自作Webフレームワーク uconを作った話GoCon2016 spring 自作Webフレームワーク uconを作った話
GoCon2016 spring 自作Webフレームワーク uconを作った話
 
GoCon 2015 Summer GoのASTをいじくって新しいツールを作る
GoCon 2015 Summer GoのASTをいじくって新しいツールを作るGoCon 2015 Summer GoのASTをいじくって新しいツールを作る
GoCon 2015 Summer GoのASTをいじくって新しいツールを作る
 
ng-japan 2015 TypeScript+AngularJS 1.3
ng-japan 2015 TypeScript+AngularJS 1.3ng-japan 2015 TypeScript+AngularJS 1.3
ng-japan 2015 TypeScript+AngularJS 1.3
 
TypeScriptは明日から使うべき
TypeScriptは明日から使うべきTypeScriptは明日から使うべき
TypeScriptは明日から使うべき
 
TypeScript 型定義ファイルのある開発 TypeScript勉強会 VSハッカソン倶楽部
TypeScript 型定義ファイルのある開発 TypeScript勉強会 VSハッカソン倶楽部TypeScript 型定義ファイルのある開発 TypeScript勉強会 VSハッカソン倶楽部
TypeScript 型定義ファイルのある開発 TypeScript勉強会 VSハッカソン倶楽部
 
Google Glass XE17版
Google Glass XE17版Google Glass XE17版
Google Glass XE17版
 
Google Glassでできること XE12版 最新開発情報 Mirror API & GDK
Google Glassでできること XE12版 最新開発情報 Mirror API & GDKGoogle Glassでできること XE12版 最新開発情報 Mirror API & GDK
Google Glassでできること XE12版 最新開発情報 Mirror API & GDK
 
コンパイラ指向ReVIEW
コンパイラ指向ReVIEWコンパイラ指向ReVIEW
コンパイラ指向ReVIEW
 
20ヶ月を取り戻す Dart flight school
20ヶ月を取り戻す Dart flight school20ヶ月を取り戻す Dart flight school
20ヶ月を取り戻す Dart flight school
 
Google Glassでできること XE11版 最新開発情報 Mirror API & GDK
Google Glassでできること XE11版 最新開発情報 Mirror API & GDKGoogle Glassでできること XE11版 最新開発情報 Mirror API & GDK
Google Glassでできること XE11版 最新開発情報 Mirror API & GDK
 
ReVIEW & CI - ChefでCI環境構築
ReVIEW & CI - ChefでCI環境構築ReVIEW & CI - ChefでCI環境構築
ReVIEW & CI - ChefでCI環境構築
 
Firefox OS勉強会 2nd TypeScript+AngularJS
Firefox OS勉強会 2nd TypeScript+AngularJSFirefox OS勉強会 2nd TypeScript+AngularJS
Firefox OS勉強会 2nd TypeScript+AngularJS
 
AngularJS+TypeScript - AngularJS 1周年記念勉強会
AngularJS+TypeScript - AngularJS 1周年記念勉強会AngularJS+TypeScript - AngularJS 1周年記念勉強会
AngularJS+TypeScript - AngularJS 1周年記念勉強会
 
Buildinsider OFFLINE TypeScriptの基礎から実践・利用事例まで
Buildinsider OFFLINE TypeScriptの基礎から実践・利用事例までBuildinsider OFFLINE TypeScriptの基礎から実践・利用事例まで
Buildinsider OFFLINE TypeScriptの基礎から実践・利用事例まで
 
Datastoreへのアクセスを楽してMemcacheアクセスに置き換えるライブラリ作った
Datastoreへのアクセスを楽してMemcacheアクセスに置き換えるライブラリ作ったDatastoreへのアクセスを楽してMemcacheアクセスに置き換えるライブラリ作った
Datastoreへのアクセスを楽してMemcacheアクセスに置き換えるライブラリ作った
 
TypeScript 勉強会
TypeScript 勉強会TypeScript 勉強会
TypeScript 勉強会
 
わかめモナ化LT
わかめモナ化LTわかめモナ化LT
わかめモナ化LT
 
NFC app launcher
NFC app launcherNFC app launcher
NFC app launcher
 
函館IKA Eclipse活用術
函館IKA Eclipse活用術函館IKA Eclipse活用術
函館IKA Eclipse活用術
 
函館IKA ICS開発情報
函館IKA ICS開発情報函館IKA ICS開発情報
函館IKA ICS開発情報
 

デバッグ戦略

  • 1. (@v vakame) Android 2011 8 25
  • 2. • • http://www.slideshare.net/vvakame/debugging-strategy 2011 8 25
  • 3. 2011 8 25
  • 4. 2011 8 25
  • 5. … 2011 8 25
  • 6. • initA() initB() init() A, B public • 2 • ( ) • • … 2011 8 25
  • 7. /** * bitmap . * * @param bitmapArrays */ static void dot1PixelA(Bitmap[][] bitmapArrays) { for (int i = 0; i < bitmapArrays.length; i++) { for for (int j = 0; j < bitmapArrays[i].length; i++) { bitmapArrays[j][i].setPixel(0, 0, Color.RED); } } } /** * bitmap . * * @param bitmapArrays */ static void dot1PixelB(Bitmap[][] bitmapArrays) { for (Bitmap[] bitmapArray : bitmapArrays) { for (Bitmap bitmap : bitmapArray) { for-each bitmap.setPixel(0, 0, Color.RED); } } } 2011 8 25
  • 8. /** * bitmap . * * @param bitmapArrays */ static void dot1PixelA(Bitmap[][] bitmapArrays) { for (int i = 0; i < bitmapArrays.length; i++) { for for (int j = 0; j < bitmapArrays[i].length; i++) { bitmapArrays[j][i].setPixel(0, 0, Color.RED); } } } /** * bitmap . * * @param bitmapArrays */ static void dot1PixelB(Bitmap[][] bitmapArrays) { for (Bitmap[] bitmapArray : bitmapArrays) { for (Bitmap bitmap : bitmapArray) { for-each bitmap.setPixel(0, 0, Color.RED); } } } 2011 8 25
  • 9. Bitmap[][] bitmapArrays = new Bitmap[10][10]; for (int i = 0; i < bitmapArrays.length; i++) { for (int j = 0; j < bitmapArrays[i].length; j++) { bitmapArrays[i][j] = Bitmap.createBitmap(3, 3, Config.ARGB_8888); } } … 2011 8 25
  • 10. ADT 2011/08/25 rev12 2011 8 25
  • 11. 2011 8 25
  • 12. • • • null 2011 8 25
  • 14. • L07 @Override L08 public void onCreate(Bundle savedInstanceState) { L09 super.onCreate(savedInstanceState); L10 setContentView(R.layout.main); L11 L12 try { L13 throw new NullPointerException(); L14 } catch (Exception e1) { L15 try { L16 throw new IllegalArgumentException(e1); L17 } catch (Exception e2) { L18 try { L19 throw new IllegalStateException(e2); L20 } catch (Exception e3) { L21 throw new RuntimeException(e3); L22 } L23 } L24 } L25 } Caused 2011 8 25
  • 15. L08 @Override L09 public void onCreate(Bundle savedInstanceState) { L10 super.onCreate(savedInstanceState); L11 setContentView(R.layout.main); L12 requestWindowFeature(Window.FEATURE_NO_TITLE); L13 } L11 L12 2011 8 25
  • 16. L22 … L09 @Override L10 public void onCreate(Bundle savedInstanceState) { L11 super.onCreate(savedInstanceState); L12 L13 LinearLayout layout1 = new LinearLayout(this); L14 LinearLayout layout2 = new LinearLayout(this); L15 LinearLayout layout3 = new LinearLayout(this); L16 Button button = new Button(this); L17 L18 layout1.addView(layout2); L19 L20 layout2.addView(layout1); layout3.addView(button); layout1 → layout2 → layout1 L21 L22 setContentView(layout1); layout1 → layout2 → layout3 … L23 } 2011 8 25
  • 17. ” • ( ω ´) • • • ← • …… …… • … orz ← 2011 8 25
  • 18. ” • • • • … • 2011 8 25
  • 19. void sort() { List<String> list = new ArrayList<String>(); list.add("cupcake"); list.add(null); list.add("donuts"); list.add(null); list.add("froyo"); Collections.sort(list, new Comparator<String>() { @Override public int compare(String str1, String str2) { if (str1 == null) { return -1; } return str1.compareTo(str2); } }); Log.d("Debug", list.toString()); } NullPointerException … LogCat … 2011 8 25
  • 20. 2011 8 25
  • 21. str2 null String#compareTo(String) null … 2011 8 25
  • 23. 2011 8 25
  • 24. public class Util { /** * 2 1 . * @param list1 1 * @param list2 2 * @return 1 */ public static List<Object> merge(List<Object> list1, List<Object> list2) { list1.addAll(list2); return list1; } /** * 1 . * @param lists * @return 1 */ public static List<Object> merge(List<?>... lists) { List<Object> result = new ArrayList<Object>(); for (List<?> list : lists) { result.addAll(list); } return result; } } 2011 8 25
  • 25. public void test() { List<Object> list1 = new ArrayList<Object>(); list1.add("a"); list1.add("b"); List<Object> list2 = new ArrayList<Object>(); list2.add(1); list2.add(2); List<Object> list3 = new ArrayList<Object>(); list3.add(1.25); list3.add(2.5); List<Object> merged1 = Util.merge(list1, list2); List<Object> merged2 = Util.merge(list1, list2, list3); assertEquals(merged1.size(), 4); assertEquals(merged1.get(0), "a"); assertEquals(merged1.get(1), "b"); assertEquals(merged1.get(2), 1); assertEquals(merged1.get(3), 2); assertEquals(merged2.size(), 6); assertEquals(merged2.get(0), "a"); assertEquals(merged2.get(1), "b"); assertEquals(merged2.get(2), 1); assertEquals(merged2.get(3), 2); assertEquals(merged2.get(4), 1.25); assertEquals(merged2.get(5), 2.5); } 2011 8 25
  • 26. public void test() { List<Object> list1 = new ArrayList<Object>(); list1.add("a"); list1.add("b"); List<Object> list2 = new ArrayList<Object>(); list2.add(1); list2.add(2); List<Object> list3 = new ArrayList<Object>(); list3.add(1.25); list3.add(2.5); List<Object> merged1 = Util.merge(list1, list2); List<Object> merged2 = Util.merge(list1, list2, list3); assertEquals(merged1.size(), 4); assertEquals(merged1.get(0), "a"); assertEquals(merged1.get(1), "b"); assertEquals(merged1.get(2), 1); assertEquals(merged1.get(3), 2); size 8 assertEquals(merged2.size(), 6); assertEquals(merged2.get(0), "a"); assertEquals(merged2.get(1), "b"); assertEquals(merged2.get(2), 1); assertEquals(merged2.get(3), 2); assertEquals(merged2.get(4), 1.25); assertEquals(merged2.get(5), 2.5); } 2011 8 25
  • 28. • F8 • F5 1 ( ) • F6 1 ( ) • F7 2011 8 25
  • 29. 8 … 2011 8 25
  • 30. ( ) 2011 8 25
  • 31. • , , • Variables • • 2011 8 25
  • 32. ¨ ¨ ¨ ¨ ¨ ¨ ¨ ¨... 2011 8 25
  • 34. 2011 8 25
  • 35. • • • • • 2011 8 25
  • 36. 2011 8 25
  • 37. OpenGL 2011 8 25
  • 39. 2011 8 25