Miscellaneous Flashcards
package com.udayan.oca;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
public class Test {
public static void main(String[] args) {
List dryFruits = new ArrayList<>();
dryFruits.add(“Walnut”);
dryFruits.add(“Apricot”);
dryFruits.add(“Almond”);
dryFruits.add(“Date”);
Iterator iterator = dryFruits.iterator(); while(iterator.hasNext()) { String dryFruit = iterator.next(); if(dryFruit.startsWith("A")) { dryFruits.remove(dryFruit); } } System.out.println(dryFruits); } }
Qual problema pode ocorrer ao executar esse codigo?
ConcurrentModificationException exception sera lancada. So posso remover/adicionar items em uma lista que esta sendo iterada, se eu utilizar o proprio objeto iterator.
package com.udayan.oca;
import java.util.ArrayList;
import java.util.List;
public class Test { public static void main(String[] args) { List list = new ArrayList<>(); list.add(0, 'V'); list.add('T'); list.add(1, 'E'); list.add(3, 'O');
if(list.contains('O')) { list.remove('O'); }
for(char ch : list) { System.out.print(ch); } } }
Qual o problema desse codigo?
Lancara uma RuntimeException, porque ‘O’ em list.remove(‘O’) sera auto-boxed para int, ao inves de Character, entao isso ira lancar um ArrayIndexOutOfBoundsException.
Ficar atento com a regra de autoboxing do Java.
public class Test { public static void main(String[] args) { m1(); //Line 3 }
private static void m1() throws Exception { //Line 6 System.out.println("NOT THROWING ANY EXCEPTION"); //Line 7 } } Qual o erro desse codigo?
O metodo m1 esta declarando uma Exception, por nao ser do tipo Runtime, eu preciso declarar ela no metodo main ou trata-la.
public class Test { public static void main(String[] args) { Double [] arr = new Double[2]; System.out.println(arr[0] + arr[1]); } }
Qual o erro desse codigo?
arr eh um array to tipo Double, entao ao chamar arr[0], o objeto ira chamar arr[0].doubleValue() (para pegar o valor do tipo primitivo) e entao lancara uma NullPointerException.
import java.util.ArrayList;
import java.util.List;
class Student { private String name; private int age;
Student(String name, int age) { this.name = name; this.age = age; } public String toString() { return "Student[" + name + ", " + age + "]"; } }
public class Test { public static void main(String[] args) { List students = new ArrayList<>(); students.add(new Student("James", 25)); students.add(new Student("James", 27)); students.add(new Student("James", 25)); students.add(new Student("James", 25));
students.remove(new Student("James", 25)); for(Student stud : students) { System.out.println(stud); } }
Qual a saida desse codigo?
Student [James, 25]
Student [James, 27]
Student [James, 25]
Student [James, 25]
Nenhum objeto anterior vai ser removido da lista, porque eu nao estou passando a referencia de um objeto ja criado e sim criando um novo objeto na memoria que tem os valores iguais a de outro objeto. Resumindo, a linha com o remove() nao vai fazer nada porque ele nao vai encontrar esse novo objeto na lista.
public class Test { public static void main(String [] args) { LocalDate date = LocalDate.of(2020, 9, 31); System.out.println(date); } }
Qual o problema desse codigo?
O codigo ira lancar uma DateTimeException, porque setembro vai ate 30.
Lembrar que LocalDate overrides o metodo toString(), entao se fosse uma data valida ele iria printar sem problema.
public class Test { public static void main(String[] args) { System.out.println("Output is: " + 10 != 5); } }
Qual o problema desse codigo?
O problema eh que o Java vai concatenar primeiro a string com o 10. Depois vai tentar comparar a nova String com um inteiro e isso ai vai dar erro de compilacao. Portanto, preciso ter mais atencao com a questao da precedencia dos operadores.
LocalDate is final entao nao pode ser extendida.
public class Test { public static void main(String[] args) { StringBuilder sb = new StringBuilder(); System.out.println(sb.append(null).length()); } }
Qual o problema desse codigo?
Como StringBuilder aceita varios objetos como parametros (String, char[] e StringBuffer), passar um null como parametro faz com que o Java nao saiba qual overload do metodo eu quero utilizar, fica uma chamada ambigua, consequentemente ele nao vai compilar.
Ter atencao com os metodos que tem varios overloads e que aceitam tipos primitivos e seus respecitvos Wrappers.
Quando o valor default de uma variavel do tipo primitivo char eh printado, o valor printado sera vazio.
public static void main e static public void main sao ambos validos no Java.
posso armazenar um char em uma variavel do tipo int e o inverso tambem acontece (contanto que esse valor inteiro esteja entre o range do tipo char).
Variaveis com escopo local nao podem ter sua inicializacao dependente de uma estrutura condicional (if-else, switch), vai dar erro de compilacao.
Strings concatenadas serao armazenadas na string pool se ambas forem constantes em tempo de compilacao. Se alguma parte da concatenacao for uma variavel, entao a string sera armazenada na memoria HEAP.
Obs: isso so vale para constantes que nao estejam armazenadas em variaveis, ou seja, “texto” e nao: String x = “texto”;